{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第2章 感知机"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1．感知机是根据输入实例的特征向量$x$对其进行二类分类的线性分类模型：\n",
    "\n",
    "$$\n",
    "f(x)=\\operatorname{sign}(w \\cdot x+b)\n",
    "$$\n",
    "\n",
    "感知机模型对应于输入空间（特征空间）中的分离超平面$w \\cdot x+b=0$。\n",
    "\n",
    "2．感知机学习的策略是极小化损失函数：\n",
    "\n",
    "$$\n",
    "\\min _{w, b} L(w, b)=-\\sum_{x_{i} \\in M} y_{i}\\left(w \\cdot x_{i}+b\\right)\n",
    "$$\n",
    "\n",
    "损失函数对应于误分类点到分离超平面的总距离。\n",
    "\n",
    "3．感知机学习算法是基于随机梯度下降法的对损失函数的最优化算法，有原始形式和对偶形式。算法简单且易于实现。原始形式中，首先任意选取一个超平面，然后用梯度下降法不断极小化目标函数。在这个过程中一次随机选取一个误分类点使其梯度下降。\n",
    " \n",
    "4．当训练数据集线性可分时，感知机学习算法是收敛的。感知机算法在训练数据集上的误分类次数$k$满足不等式：\n",
    "\n",
    "$$\n",
    "k \\leqslant\\left(\\frac{R}{\\gamma}\\right)^{2}\n",
    "$$\n",
    "\n",
    "当训练数据集线性可分时，感知机学习算法存在无穷多个解，其解由于不同的初值或不同的迭代顺序而可能有所不同。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 二分类模型\n",
    "$f(x) = sign(w\\cdot x + b)$\n",
    "\n",
    "$\\operatorname{sign}(x)=\\left\\{\\begin{array}{ll}{+1,} & {x \\geqslant 0} \\\\ {-1,} & {x<0}\\end{array}\\right.$\n",
    "\n",
    "给定训练集：\n",
    "\n",
    "$T=\\left\\{\\left(x_{1}, y_{1}\\right),\\left(x_{2}, y_{2}\\right), \\cdots,\\left(x_{N}, y_{N}\\right)\\right\\}$\n",
    "\n",
    "定义感知机的损失函数 \n",
    "\n",
    "$L(w, b)=-\\sum_{x_{i} \\in M} y_{i}\\left(w \\cdot x_{i}+b\\right)$\n",
    "\n",
    "---\n",
    "#### 算法\n",
    "\n",
    "随即梯度下降法 Stochastic Gradient Descent\n",
    "\n",
    "随机抽取一个误分类点使其梯度下降。\n",
    "\n",
    "$w = w + \\eta y_{i}x_{i}$\n",
    "\n",
    "$b = b + \\eta y_{i}$\n",
    "\n",
    "当实例点被误分类，即位于分离超平面的错误侧，则调整$w$, $b$的值，使分离超平面向该无分类点的一侧移动，直至误分类点被正确分类"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "拿出iris数据集中两个分类的数据和[sepal length，sepal width]作为特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.datasets import load_iris\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# load data\n",
    "iris = load_iris()\n",
    "df = pd.DataFrame(iris.data, columns=iris.feature_names)\n",
    "df['label'] = iris.target"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2    50\n",
       "1    50\n",
       "0    50\n",
       "Name: label, dtype: int64"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.columns = [\n",
    "    'sepal length', 'sepal width', 'petal length', 'petal width', 'label'\n",
    "]\n",
    "df.label.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1781578e588>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(df[:50]['sepal length'], df[:50]['sepal width'], label='0')\n",
    "plt.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], label='1')\n",
    "plt.xlabel('sepal length')\n",
    "plt.ylabel('sepal width')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = np.array(df.iloc[:100, [0, 1, -1]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "X, y = data[:,:-1], data[:,-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "y = np.array([1 if i == 1 else -1 for i in y])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Perceptron"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据线性可分，二分类数据\n",
    "# 此处为一元一次线性方程\n",
    "class Model:\n",
    "    def __init__(self):\n",
    "        self.w = np.ones(len(data[0]) - 1, dtype=np.float32)\n",
    "        self.b = 0\n",
    "        self.l_rate = 0.1\n",
    "        # self.data = data\n",
    "\n",
    "    def sign(self, x, w, b):\n",
    "        y = np.dot(x, w) + b\n",
    "        return y\n",
    "\n",
    "    # 随机梯度下降法\n",
    "    def fit(self, X_train, y_train):\n",
    "        is_wrong = False\n",
    "        while not is_wrong:\n",
    "            wrong_count = 0\n",
    "            for d in range(len(X_train)):\n",
    "                X = X_train[d]\n",
    "                y = y_train[d]\n",
    "                if y * self.sign(X, self.w, self.b) <= 0:\n",
    "                    self.w = self.w + self.l_rate * np.dot(y, X)\n",
    "                    self.b = self.b + self.l_rate * y\n",
    "                    wrong_count += 1\n",
    "            if wrong_count == 0:\n",
    "                is_wrong = True\n",
    "        return 'Perceptron Model!'\n",
    "\n",
    "    def score(self):\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Perceptron Model!'"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "perceptron = Model()\n",
    "perceptron.fit(X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x178158adfc8>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEICAYAAABS0fM3AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3deXxU5fX48c8hAUJYZRMEQthEIIAs4oKKCm6IQKtWrLaitbSgdamt358VsIK4tNW6VS3WWhfcais7KKIoVAXBBcKOrGGRfQ2BLOf3x51IiAm5Se6dO3fmvF+veSVz586d88zAnNz7nOd5RFUxxhiTuKoEHYAxxphgWSIwxpgEZ4nAGGMSnCUCY4xJcJYIjDEmwVkiMMaYBOd7IhCRJBH5SkSmlvDYUBHZISJfR263+B2PMcaY4yVH4TXuAJYDdUp5/C1Vvc3twRo2bKjp6elexGWMMQlj0aJFO1W1UUmP+ZoIRKQ5cAUwDvitF8dMT09n4cKFXhzKGGMShohsKO0xvy8NPQHcAxScYJ+rRGSxiLwjIi1K2kFEhonIQhFZuGPHDl8CNcaYROVbIhCRAcB2VV10gt2mAOmq2gX4AHi5pJ1Udbyq9lTVno0alXhmY4wxpoL8PCPoDQwUkfXAm8BFIvJa0R1UdZeqHoncfQHo4WM8xhhjSuBbH4Gq3gvcCyAiFwC/U9Ubiu4jIk1VdWvk7kCcTuVyy83NJSsri5ycnEpE7L+UlBSaN29O1apVgw7FGGO+F42qoeOIyBhgoapOBm4XkYFAHrAbGFqRY2ZlZVG7dm3S09MREe+C9ZCqsmvXLrKysmjVqlXQ4RhjzPeiMqBMVeeo6oDI76MjSQBVvVdVO6lqV1W9UFVXVOT4OTk5NGjQIGaTAICI0KBBg5g/azGxYcIESE+HKlWcnxMmBB2RiWdRPyPwSywngUJhiNEEb8IEGDYMsrOd+xs2OPcBrr8+uLhM/LIpJoyJMffddywJFMrOdrYb4wdLBB6aOXMm7du3p23btjzyyCNBh2NCauPG8m03prISMhH4cf01Pz+fW2+9lRkzZrBs2TLeeOMNli1bVvkDm4STlla+7cZUVsIlgsLrrxs2gOqx66+VTQYLFiygbdu2tG7dmmrVqjFkyBAmTZrkTdAmoYwbB6mpx29LTXW2G+OHhEsEfl1/3bx5My1aHJsho3nz5mzevLlyBzUJ6frrYfx4aNkSRJyf48dbR7HxT9xUDbnl1/VXVf3BNqsSMhV1/fX2xW+iJ+HOCPy6/tq8eXM2bdr0/f2srCxOOeWUyh3UGGOiIOESgV/XX8844wxWr17NunXrOHr0KG+++SYDBw6s3EGNMSYKEi4R+HX9NTk5mWeeeYZLL72UDh068JOf/IROnTp5E7Qxxvgo4foIwL/rr/3796d///7eH9gYY3yUcGcExhhjjmeJwBhjEpwlAmOMiXEHcnIZM2UZ81bv9OX4CdlHYIwxYaCqTFuylbFTl7H9wBHq16zKue0aev46dkZgjAds/QDjtbU7DvLzfy7gtte/olHt6rw7oje3XdTOl9eyMwJjKsnWDzBeysnN59mP1vD8x2upnlyFBwZ24oazWpJUxb+ZCuyMwCM333wzjRs3JiMjI+hQTJTZ+gHGKx+t3M4lf/2Epz5cw+WdmzD7d3248Zx0X5MAJGoiWDcBJqbD61Wcn+sqfx4/dOhQZs6cWenjmPCx9QNMZW3Ze5hfv7qIm176guQk4fVbzuTJId1oXDslKq+feJeG1k2ABcMgP/InXPYG5z5Aq4qfx59//vmsX7++8vGZ0ElLcy4HlbTdmBPJzS/gpf+t44kPVlOgyu8vbc8vz2tNteTo/o2eeGcE39x3LAkUys92thtTAbZ+gKmIBet2c8VTc3lo+grOadOAWXf14dYL20Y9CUAinhFkl3K+Xtp2Y8pQ2CF8333O5aC0NCcJWEexKcnOg0d4ePoK/vNlFs3q1eCFn/fk4o4nBxpT4iWC1DTnclBJ242pIFs/wJSloEB544uN/GnmSrKP5jHigjbcdlFbUqsF/zWceJeGuo6DpGLn8UmpznYTalbLb2JV5uZ9/Oi5T7nv3Uw6NK3NjDvO457LTouJJACJmAhaXQ+9xkNqS0Ccn73GV6qjGOC6667j7LPPZuXKlTRv3pwXX3zRm3iNK36tRW1MZezPyeWPk5cy8Jl5bN6TzRPXns4bvzyLto1rBx3acaSkJRZjWc+ePXXhwoXHbVu+fDkdOnQIKKLyCVOsYZKeXnLlTsuWYMVcJtpUlcnfbGHs1OXsOnSEn53VkrsvaU/dGlUDi0lEFqlqz5Iei43zEmMqyWr5TaxYs/0goydl8um3u+jSvC4vDT2Dzs3rBh3WCVkiMHHBavlN0A4fzeeZj1Yz/pO11KiaxIODM7iuV5rvo4K9EDeJQFURie03PGyX4cJk3Ljj5/sBq+U30TN7+XfcP3kpWXsO8+Puzbj38g40ql096LBci4tEkJKSwq5du2jQoEHMJgNVZdeuXaSkRGfIeKKxWn4ThKw92TwwZRmzln1Hu8a1eHPYWZzVukHQYZVbXHQW5+bmkpWVRU5OTkBRuZOSkkLz5s2pWjW4DiNjTOUdzSvgH/PW8tTs1QjCHf3a8YtzW1E1KXYLMQPtLBaRJGAhsFlVBxR7rDrwCtAD2AVcq6rry/saVatWpVWrVh5Ea0y4TJhgZ0HR9tm3uxg1KZM12w9yaaeTGX1lJ5rVqxF0WJUSjUtDdwDLgTolPPYLYI+qthWRIcCjwLVRiMmY0LN1EKJrx4EjPDR9Oe9+tZkW9Wvwz6E9uei0YKeG8Iqv5zEi0hy4AvhHKbsMAl6O/P4O0Fdi9SK/MTHG1kGIjvwC5ZXP1nPRY3OYungLv7moLe/f2SdukgD4f0bwBHAPUNowumbAJgBVzRORfUAD4LgVmkVkGDAMIM3qAY0BbOxENHyzaS8jJ2ayZPM+erdtwJhBGbRpVCvosDznWyIQkQHAdlVdJCIXlLZbCdt+0HutquOB8eB0FnsWpDEhZmMn/LMvO5c/v7+CCfM30rBWdZ66rhtXdmkas1WJleXnGUFvYKCI9AdSgDoi8pqq3lBknyygBZAlIslAXWC3jzEZEzds7IT3VJX/frmZh6YvZ0/2UYaek85dF59KnZT4rvTzLRGo6r3AvQCRM4LfFUsCAJOBG4HPgKuBDzVs9azGBMTGTnhr1XcHGDkxkwXrdtMtrR6v/KIXnU6J7akhvBL1AWUiMgZYqKqTgReBV0VkDc6ZwJBox2NMmNk6CJWXfTSPp2av4R9z11KzejIP/7gz1/ZsQZUQTA3hlagkAlWdA8yJ/D66yPYc4JpoxGBMeY0YAePHQ34+JCU5l2GefTboqIxXVJX3l33HA5OXsmVfDj/p2Zz/u+w0GtQKz9QQXomLKSaM8dqIEfDcc8fu5+cfu2/JIPw27srmj1OW8uGK7bQ/uTb/vq4bZ6TXDzqswMTFFBPGeC052fnyLy4pCfLyoh+P8caRvHzGf7yWZz5aQ3IV4a6LT+XGc9JjemoIr9h6BMaUU0lJ4ETbTeybt3onoydlsnbnIfp3bsKoAR1pWjfcU0N4xRKBMSVISir9jMCEy/b9OYydtpwp32yhZYNU/nXTGVzQvnHQYcUUSwTGlGDYsOP7CIpuN+GQl1/Aq59v4LH3V3E0v4A7+7Xj133akFLVsnlxlgiMKUFhh7BVDYXTlxv3MPLdTJZt3c/5pzbigYGdaNWwZtBhxSzrLDbGxI09h47yp/dW8MaCTTSpk8LoKztyeUaTuJ0aojxO1Fkc/13lJvT69QORY7d+/YKOyH8TJkB6OlSp4vycMCHoiGJbQYHy9sJN9H38Y95emMUvz2vFB3f3oX/n+J0fyEt2acjEtH79YPbs47fNnu1s/+CDYGLym60zUD7Lt+5n1MRMFm7YQ4+WJ/Hg4Aw6NC1p+RNTGrs0ZGLaif6YC9k/XdfS00ueVbRlS1i/PtrRxK6DR/J4YtYqXvp0PXVSkrm3fweu7t48oaaGKA8bR2BMiNg6AyemqszI3MaYKcvYtj+H63q14J5LT+OkmtWCDi20LBEYE2NsnYHSrd95iPsnL+XjVTvo2LQOz97Qne5pJwUdVuhZZ7GJaX37lm97PBg3zllXoKhEX2cgJzefJz5YxSVPfMKiDXu4/8qOTL6ttyUBj9gZgYlpH3zwww7jvn3jt6MYbJ2B4j5etYPRkzLZsCubK7uewsgrOnBynZSgw4or1llsjIlJ2/blMGbqUqYv2UbrhjUZMyiDc9s1DDqs0LJxBCbUvK6pd3s8q+UPRm5+Af+Yu5a+j81h9vLt3H3xqcy48zxLAj6yS0MmpnldU+/2eFbLH4yF63czcmImK7Yd4ML2jXhgYAZpDVLLfqKpFLs0ZGKa1zX1bo9ntfzRtfvQUR6ZsZy3F2ZxSt0U7h/YiUs6nmyjgj1k4whMaHldU+/2eFbLHx0FBcpbCzfx6MwVHMzJ41d9WnP7Re2oWd2+mqLJ3m0T07yuqXd7PKvl99/SLfsYOTGTrzbupVer+jw4OINTT64ddFgJyTqLTUzzuqbe7fGslt8/B3JyeWDKUq58eh4bd2Xz2DVdeWvYWZYEAmRnBCameV1T7/Z4VsvvPVVl6uKtjJ26jB0Hj3D9mWn8/pLTqJtaNejQEp51FhtjfLd2x0FGT1rKvDU76dysLg8OzqBri3pBh5VQbBxBAgqyBt7q9E2hnNx8Hnt/JZc9MZdvsvYyZlAnJt7a25JAjLFLQ3EoyBp4q9M3hT5asZ3RkzPZtPswP+rWjHv7n0bj2jY1RCyyS0NxKMgaeKvTN5v3HmbMlKW8t/Q72jSqydjBGZzTxkYFB83GESSYIGvgrU4/ceXmF/DPeet44oPVKMo9l7XnlnNbUy3ZrkDHOksEcSjIGnir009M89fuYtSkTFZ9d5B+HU7m/is70qK+TQ0RFpaq41CQNfBWp59Ydh48wm/f/pprx3/OoSP5vPDznvzjxp6WBELGzgjiUJA18FannxjyC5Q3FmzkTzNXcDg3nxEXtOE3F7WjRrWkoEMzFWCdxcaYclmStY+RE5fwTdY+zm7dgLGDO9G2sY0KjnWBjCMQkRQRWSAi34jIUhF5oIR9horIDhH5OnK7xa94TOwZMQKSk0HE+TliROX2C8PYiTDbdziX+ydlMuhv89i8N4cnh5zO678805JAPFBVX26AALUiv1cF5gNnFdtnKPBMeY7bo0cPNeE3fLgq/PA2fHjF9nvtNdXU1OP3SU11tvstyNeOhoKCAn33yyztMXaWtvp/U3X0xCW6N/to0GGZcgIWainfq1G5NCQiqcA8YLiqzi+yfSjQU1Vvc3ssuzQUH5KTIT//h9uTkiAvr/z7hWHsRBit2X6AUROX8tnaXXRtXpcHB3emc/O6QYdlKiCwcQQikgQsAtoCfyuaBIq4SkTOB1YBd6nqphKOMwwYBpBm9YVxoaQv95K2u90vDGMnwuTw0Xye/nA1L8xdS42qSTw4OIPreqWRVMUWiolHZSYCEakOXAWkF91fVceU9VxVzQdOF5F6wLsikqGqmUV2mQK8oapHROTXwMvARSUcZzwwHpwzgrJe18S+pKTS/9KvyH5hGDsRFh8s+477Jy9l897DXNW9Off2P42GtaoHHZbxkZvO4knAICAPOFTk5pqq7gXmAJcV275LVY9E7r4A9CjPcU14Fc4rVNZ2t/uFYexErNu0O5tbXl7ILa8sJLVaEm8NO4vHftLVkkAiKK3zoPAGZJa1TynPawTUi/xeA5gLDCi2T9Miv/8I+Lys41pncfwYPlw1KcnpXE1K+mEHcHn3e+011ZYtVUWcn9HsrA3ytSvrSG6+PvPham0/crqeNnKGPj9njR7Nyw86LOMxKtNZLCLjgadVdUl5EoyIdMG51JOEc+bxtqqOEZExkYAmi8jDwECcs43dOJ3JK050XOssNsY7n367k1ETM/l2xyEu69SE0Vd25JR6NYIOy/igQuMIRGSJiCwGzgW+FJGVIrK4yPYTUtXFqtpNVbuoaoZG+hRUdbSqTo78fq+qdlLVrqp6YVlJwLjnR12723p+r48X1PoGXrc3lmw/kMOdb37FT1+YT26+8tLQM3j+Zz04Zc9/YWI6vF7F+bkuDgdEmB8q7VQBaHmiW2nP8/tml4bK5kddu9t6fq+P57YtXrfZ6/bGirz8Av3X/9ZpxuiZ2u4P0/Wx91bo4aN5zoNrX1N9M1V1Asdub6Y6203oUclLQ6+q6s/K2hYtdmmobH7Utbut5/f6eEGtb+B1e2PB15v2MnLiEjI37+fctg0ZM6gTrRvVOrbDxHTILuFNTG0Jg9dHK0zjk8qOI+hU7GBJWHVPTPOjrt1tPb/XxwtqfQOv2xukfdm5/Om9Fby+YCONalXn6eu6MaBLU0SKjQnILuXNKm27iRulJgIRuRf4A1BDRPYXbgaOEqnpN7HJj7p2t/X8Xh8vqPUNvG5vEFSV/365mYemL2dP9lFuOqcVd13cjtopVUt+QmpaKWcEIR0QYVwrtbNYVR9W1drAn1W1TuRWW1UbqOq9UYzRlJMfde1u6/m9Pl5Q6xt43d5oW/XdAa79++fc/e9vaNkglSm/OZfRV3YsPQkAdB0HScXexKRUZ7uJb6V1HgDdT3Qr7Xl+36yz2B0/6trd1vN7fTy3bfG6zV63NxoO5uTqQ9OWaZt7p2nXB97TN+Zv0Pz8AvcHWPua6rstVSeI89M6iuMGFeksFpGPIr+mAD2Bb3AuDXUB5qvquT7mp1JZZ7ExP6SqvLf0O8ZMWcqWfTlc27MF/3f5adSvWS3o0EyMqNA4AnXq+i8ENuCcAfRU1R5AN2CNP6GaRBLU+IB4s3FXNjf/6wt+/doi6tSoyju/PptHr+4SviSwboKNYQiIm6qh07TIqGJVzRSR032MySSACROc6+3Z2c79DRuOXX8vulyl2/0S0ZG8fP7+8Vr+9tEakqsII6/owNBz0klOCuFS5OsmwIJhkB/5oLM3OPcBWiX4Bx0FbsYRvIEzydxrgAI34Cw4c53/4f2QXRqKD0GND4gXc1fvYPSkpazbeYgrOjdl1ICONKmbEnRYFWdjGHxX2XEENwHDgTsi9z8BnvMoNpOgghofEHbf7c9h7NRlTF28lfQGqbx8cy/6nNoo6LAqz8YwBKrMRKCqOcBfIzdjPBHU+ICwyssv4JXPNvD4rFUczS/grn6n8qs+rUmpGqKBDSdiYxgCdaJJ596O/FwSmWzuuFv0QjTxKKjxAWG0aMMernzmf4yZuoweLU9i1l3nc0e/dvGTBMDGMATsRGcEhZeCBkQjEJNYCjt677vPucyTluZ8uRfvAHa7Xzzac+goj85cwZtfbKJJnRSeu747l2U0+eHUEPGgsEP4m/ucy0GpaU4SsI7iqHDTWXwzMFdVV0cnpBOzzmIT7woKlHcWZfHwjOXsz8nj5t7p3NHvVGpV93WJcRPnKjSOoIh04O8i8q2IvC0iv7HyUe95XSvv9nhBzrlv4wN+aPnW/Vzz98+45z+LadOoFtNuP5f7ruhY+SQQTzX68dQWt/xuc2lDjovfcJabvB3YCOS7fZ7Xt3icYsLrufTdHi/IOff9WDMhzA7k5OrYKUu19b3TtNuY9/XtLzaWb2qIE4mndQbiqS1uedRmKrkewUigN1AL+AqYh3OpaKu3KcmdeLw05HWtvNvjBTnnvo0PcKgq05dsY8zUpWw/cIQhZ7TgnktP4yQvRwXHU41+PLXFLY/aXNlxBD/GWVN4GvAxzgLzOa5f3ZTJ61p5t8cLcs59Gx8A63YeYvSkTOau3knHpnV47oYedE87yfsXiqca/Xhqi1tRaHOZfQSq2h3oCywALgaWiMg8zyIwpdbEV7RW3u3xSptbPxpz7nvd5jDJyc3nr7NWcekTn/D1xr388cqOTL6ttz9JAEqvxQ9jjX48tcWtKLS5zEQgIhk400rcCFwLZAEfehaB8bxW3u3xgpxzP1HHB8xZuZ1Ln/iEJ2ev5rJOTZh9dx+G9m7l7/xA8VSjH09tcSsabS6t86DwhnNJ6B7gHKBqWfv7fYvHzmJV7+fSd3u8IOfc92PNhFi1ZW+2Dn9tobb8v6l64Z8/0nmrd0Q3gHhaZyCe2uKWB23mBJ3FgX6pV+QWr4nAa358yYYhucSao3n5Ov7jb7XDqBl66n3T9enZqzQnNy/osExFzB+u+nqSU7XzepJzv7KimNROlAhshEoc8mPqZrfHHDECnisyJWF+/rH7zz5bsdcOqy/W72bUxExWbDvARac15oGBnWhRP7XsJ5rYs2AErCnyD1vzj93vVcF/2DE09XaZ5aOxJh7LR73mR2lmGEpSY8Wug0d4ZMYK/r0oi2b1anD/lR25uOPJ8Tk1RKJ4I9n58i9OkuC6Cv7DjnIpbGXLR03I+FGaGYaS1KAVFChvfrGJR2eu4NCRPH7dpw23921LajX7bxZ6JSWBE213I4ZKYUv9FyoiU3AWoimRqg70JSJTaX5M3ez2mElJpZ8RxLPMzfsYOTGTrzft5cxW9XlwcAbtTq4ddFjGK5JU+hlBRcXQ1Nsn+lPlL1GLwnhq3Ljjr+dD5Usz3R5z2LDj+wiKbo9HB3Jyeez9Vbzy2Xrq16zG4z/pyo+6NbPLQPGmzbDj+wiKbq+oruOO7yOAwEphS00EqvpxNAMx3vFj6ma3xyzsEB4/3jkzSEpykkC8dRSrKlMWb+XBqcvYcfAIN5zZkt9d0p66qVWDDs34obBD+NvxzpmBJDlJoKIdxRBTU2+7mWuoHfAw0BH4flFUVW3tb2gls85iE7Rvdxxk9KRM/rdmF52b1eXBwRl0bVEv6LCMOaHKTkP9Es4axXnAhcArwKsuXjRFRBaIyDcislREHihhn+oi8paIrBGR+SKS7iKeUHE71XIYpmR2O2V13LS52NS/R9e8yl/eW8llT3zC4qx9jB3UiYm39i5fElgwwqlAeV2cnwtKeRO9nnY41o8XJLdtiac2F1faAIPCG7Ao8nNJkW1zXTxPgFqR36sC84Gziu0zAng+8vsQ4K2yjhumAWVup1oOw5TMbqesjps2lzD1b/ar1fU3D9+td735lW7fn1P+Y84ffvxUwoW34gOTvJ5qOdaPFyS3bYmDNlPJaaj/B5wHvIMzx9Bm4BFVbe822YhIKs701cNVdX6R7e8Bf1TVz0QkGdgGNNITBBWmS0Nua+/DMCWz2/EBcdPmUmq8c6o1J+XqTRU7pttadK/ry2P9eEFy25Y4aHNlLw3dCaTiLErTA/gZzgR0bl44SUS+BrYDs4omgYhmwCYAVc0D9gENSjjOMBFZKCILd+zY4ealY4Lb2vswTMnsdnxAvLRZS6nlTjm6uRIHdVmL7nV9eawfL0hu2xJPbS6Bm2mov1DVg8B+4HZV/bGqfu7m4Kqar6qnA82BXpGZTIsqqcbuB2cDqjpeVXuqas9GjRq5eemY4Haq5TBMyex2yup4aPPna3exPa9xyQ9Wpsa7tJrz4tu9nnY41o8XJLdtiac2l8DNNNQ9RWQJsBhnLYJvRKRHeV5EVfcCc4DLij2UBbSIvE4yUBfYXZ5jxzK3Uy2HYUpmt1NWh7nNOw4c4bdvf82Q8Z/z3L6byZcax+9Q2Rrv0mrOi2/3etrhWD9ekNy2JZ7aXJLSOg8KbzgJ4Lwi988FFrt4XiOgXuT3GsBcYECxfW7l+M7it8s6bpg6i1Xdz9gZhimZ3c4qGrY25+UX6CufrdfO98/Utn+Ypn+euUKzj+T5MzOk2xksvX7tWD9ekNy2JeRtprKdxarau6xtJTyvC/AykIRz5vG2qo4RkTGRgCaLSApOKWo3nDOBIaq69kTHDVNnsYl9i7P2MnJiJouz9nFOmwaMGZRB28a1gg7LGM9VtrN4gYj8XUQuEJE+IvIsMEdEuotI99KepKqLVbWbqnZR1QxVHRPZPlpVJ0d+z1HVa1S1rar2KisJxLOYr6mPM/sO5zJqYiaD/vY/tu7L4ckhpzPhljP9TwKxXrPuR3yxPoYhnscHuORmWsTTIz/vL7b9HJyO3Ys8jSgB+bF+gCmZqjLx682Mm7ac3YeOcuPZ6fz2klOpkxKFqSHczj8f1Dz1fsTndVti/XghZesRxICYr6mPE6u/O8DIiZnMX7ebri3qMW5wBhnN6kYvgFivWfcjvlgfwxAH4wPcqtR6BCJyMvAQcIqqXi4iHYGzVfVFj+NMWLFeUx922UfzePrDNbzwyVpqVk/moR91ZsgZLahSJcozhMZ6zbof8cX6GIY4Hx/glps+gn8B7wGnRO6vwhlkZjwSyzX1Yff+0m1c/PgnPDfnWwZ3a8bsu/vw0zPTop8EIPZr1v2IL9bHMMT5+AC33CSChqr6NlAA348AToD1pqInFmvqw27T7mxuefkLhr26iFrVk3n7V2fzl2u60rBW9eCCivWadT/ii/UxDPE+PsAlN53Fh0SkAZERvyJyFs5UEMYjfqwfkKiO5OXzj7nrePrD1VQR4Q/9T+Om3q2omuTmbx6fuZ1/Pqh56v2Iz+u2xPrxQsrNOILuwNNABpCJM1DsalVd7H94PxSPncXGG5+u2cnISZms3XGIyzOaMGpAR06pV6PsJxqTACrVWayqX4pIH6A9ztxAK1U11+MYjamw7ftzGDd9OZO+3kJa/VReuukMLmxfylxBYbFghLerYXkt1uMDpzQ0iL/0g3rdSnBTNXQNMFNVl4rISKC7iDyoql/6H54xpcsvUF79bD2Pvb+KI3kF3N63HSMuaENK1UosKB4LFow4fn1czT92Pxa+bGM9Poj9sRgxxs2locWq2kVEzsVZsvIvwB9U9cxoBFicXRoyAF9t3MPIiZks3bKf89o1ZMygDFo1rBl0WN5wu25BUGI9Poj9sRgBqNSlIY5VCF0BPKeqk0Tkj14FZ0x57M0+yp/eW8kbCzbSuHZ1/vbT7vTv3ASRAMpB/eJ23YKgxHp8EPtjMWKMm0SwWUT+DvQDHhWR6rgrOzXGM6rKO4uyeHjGCvYdzuXm3q24s187akdjaohok6TS/+KOBbEeHzjX5kv8yzwKYzGCeN1KcvOF/hOcAWWXqbOuQH3g975GZU2furkAABPwSURBVEwRK7cd4Cd//4zfv7OY9AapTLntXEYN6BifSQDcr1sQlFiPD2J/LEaMcVM1lA38t8j9rcBWP4MyBuDQkTyenL2aF+eto3ZKMo9e1ZlregQwNUS0FXa4xmpVTqzHB7E/FiPG2KRzJuaoKjMztzFm6jK27sthyBktuOey06hfs1rQoRkTWpVdj8CYqNmw6xA3/esLhk/4knqp1fjP8HN45Kou7pJAGOaV9zrGBSOcKp7Xxfm5YERsxWdCwU1nsTG+y8nNZ/wna/nbR2tIriKMGtCRG89uSbLbqSHCUL/tdYxe1/OH4T00vrBLQyZwc1fvYPSkpazbeYgBXZoy8oqONKmbUr6DxHD99ve8jtHrev4wvIemwio7jsAYX2zbl8PYacuYtngr6Q1SeeXmXpx/aqOKHSwM9dtex+h1PX8Y3kPjC0sEJury8gv416fr+eusVeQWKHf1O5Vf9WlduakhwlC/7XWMXtfzh+E9NL6wzmITVYs27GbA0/N4cNpyzmhVn1l3nc8d/dpVfn6gMNRvex2j1/X8YXgPjS/sjMBExZ5DR3lkxgreWriJpnVTeP6G7lzaycOpIcJQv+11jF7X84fhPTS+sM5i46uCAuXfizbxyIwVHMjJ4xfntuL2vu2oWd3+BjEmmmwcgQnEsi37ufr5T/m//yyhbeNaTLv9PO7t3yE+k4DX9fduj2d1/8YDcfg/0gTt4JE8/jprFf/6dD11a1TlL9d05aruzeJrhtCivK6/d3s8q/s3HrFLQ8Yzqsq0JVsZO3UZ2w8c4bpeadxzaXvqpcb51BBe19+7PZ7V/ZtysHEExnfrdh5i9KRM5q7eSadT6vD8DT3olnZS0GFFh9f1926PZ3X/xiOWCEyl5OTm8+ycb3l+zrdUT67CAwM7ccNZLUmK9xlCi/K6/t7t8azu33jEOotNhX20cjuX/PUTnpq9mss7N2H23X248Zz0xEoC4H39vdvjWd2/8YidEZhy27L3MGOnLmNG5jZaN6rJ67ecyTltGwYdVnC8rr93ezyr+zcesc5i41pufgEv/W8dT3ywmvwC5fa+7bjlvFZUT46hJQqNMSUKZByBiLQQkY9EZLmILBWRO0rY5wIR2SciX0duo/2Kx1TOF+t3M+CpeTw0fQVnt27AB7/tw60Xto1OEghDrbzV/VeevTeB8fPSUB5wt6p+KSK1gUUiMktVlxXbb66qDvAxDlMJuw4e4eEZK3hnURbN6tVg/M96cEmnJtELIAy18lb3X3n23gTKtzMCVd2qql9Gfj8ALAea+fV6xlsFBcqE+Ru46LGPmfjVZoZf0IZZvz0/ukkAnOvfhV8OhfKzne2xwm2MYWhLUOy9CVRUOotFJB3oBswv4eGzReQbYAvwO1VdWsLzhwHDANLSrDTOb5mb93HfxEy+2bSXs1rXZ+ygDNqdXDuYYMJQK291/5Vn702gfE8EIlIL+A9wp6ruL/bwl0BLVT0oIv2BiUC74sdQ1fHAeHA6i30OOWHtz8nl8fdX8cpn66lfsxp/vbYrg08PeGqIMNTKW91/5dl7EyhfxxGISFWcJDBBVf9b/HFV3a+qByO/TweqikgC1yEGQ1WZ9PVm+j72MS9/tp4bzmrJ7Lsv4Efdmgc/P1AYauWt7r/y7L0JlG9nBOJ8g7wILFfVx0vZpwnwnaqqiPTCSUy7/IrJ/NCa7QcZPSmTT7/dRZfmdXnxxp50aV4v6LCOCUOtvNX9V569N4HybRyBiJwLzAWWAAWRzX8A0gBU9XkRuQ0YjlNhdBj4rap+eqLj2jgCbxw+ms8zH61m/CdrSamaxD2XncZPe6Ul3qhgYxJEIJPOqeo84ITfKqr6DPCMXzGYks1e/h33T15K1p7D/LhbM+7t34FGtat79wLrJiTeX3YLRni3UpgxUWZTTCSQrD3ZPDBlGbOWfUe7xrV445dncXabBt6+SCLWgy8YAWueO3Zf84/dt2RgQsCmmEgAR/MKeHHeOp6avRqAO/q14+beraiW7EOtQCLOkf9GsvPlX5wkwXV50Y/HmBLYegQJ7LNvdzFqUiZrth/kko4nM/rKjjQ/KbXsJ1ZUItaDl5QETrTdmBhjiSBO7ThwhIemL+fdrzbT/KQavHhjT/p2ONn/F07EenBJKv2MwJgQsEQQZ/ILlNfnb+BP760kJzef2y5sy60XtqVGtSh9KXUdd3wfAcR/PXibYcf3ERTdbkwIWCKII4uz9nLfu5ks2byP3m0bMGZQBm0a1YpuEIlYD17YIWxVQyakrLM4DuzLzuUv76/ktfkbaFirOqMGdOTKLk2DHxVsjIkZgaxHYPwxYQKkp0OVKtCypXLnuF30fXwOE+Zv4Maz05l9dx8Gdj0lHEkgnuafj6e2BMXew8DYpaEQmTABhg2D7Mjl940bhaf+WJdu16cxeVwTMprVDTbA8oin8Qbx1Jag2HsYKDsjCJH77juWBAppXjI7Pzo1XEkA4mv++XhqS1DsPQyUJYKQUFU2biy5P2fTphBcBiounsYbxFNbgmLvYaAsEYTApt3Z/OLlhVSpfbjEx0O5Vk9p4wrCON4gntoSFHsPA2WJIIYdycvnmQ9X0+/xj/l87S6G3n6A1NTjzwpSU2FcGEv042n++XhqS1DsPQyUdRbHqP+t2cmoiZms3XmI/p2bMGpAR5rWrcGFpzl9BRs3OmcC48bB9WHsS4un8Qbx1Jag2HsYKBtHEGO278/hwWnLmfzNFtLqp/LAoE5c2L5x0GEZY0LOJp0Lgbz8Al79fAOPvb+Ko3kF3NG3HcMvaENKVZuvxkSRH2tJJOL6FCFjiSAGfLVxDyMnZrJ0y37Oa9eQMYMyaNWwZtBhmUTjRy2/jQ8IBUsEAdqbfZRHZ67kzS820rh2df720+7079wkHKOCTfw5US1/Rb+0/Tim8ZwlggAUFCjvfJnFIzNWsO9wLr/o3Yo7Lz6VWtXt4zAB8qOW38YHhIJ980TZim37GTUxky/W76F7Wj0eHNyZjqfUCTosY/xZSyIR16cIIRtHECUHj+QxbtoyrnhqHqu3H+TRqzrzzq/PsSRgYocftfw2PiAU7IzAZ6rKzMxtPDBlGdv25zDkjBb832WncVLNakGHZszx/Kjlt/EBoWDjCHy0fuch7p+8lI9X7aBD0zo8ODiDHi1PCjosY0wCsnEEUZaTm8/zH3/Ls3O+pWoVYdSAjtx4dkuSk+xKnDEm9lgi8Ngnq3YwelIm63dlM6BLU0Ze0ZEmdVOCDssYY0plicAj2/blMHbqMqYt2UqrhjV59Re9OK9do6DDMsaYMlkiqKS8/AL+9el6/jprFXkFyt0Xn8qwPq2pnmxTQxhjwsESQSUsXL+bkRMzWbHtABe0b8SYgRmkNUgt+4nGGBNDLBFUwO5DR3lkxnLeXphF07opPH9DDy7tdLJNDWGMCSVLBOVQUKC8vXATj8xcwcGcPH51fmtu79uOmjY1hDEmxOwbzKWlW/YxcmImX23cS6/0+owdnEH7JrWDDssYYyrNt0QgIi2AV4AmQAEwXlWfLLaPAE8C/YFsYKiqfulXTBVxICeXx2et4uVP13NSajUeu6YrP+7ezC4DecHmqTcmJvh5RpAH3K2qX4pIbWCRiMxS1WVF9rkcaBe5nQk8F/kZOFVl6uKtjJ26jB0Hj/DTXmn8/tL21Eu1qSE8YfPUGxMzfEsEqroV2Br5/YCILAeaAUUTwSDgFXXmufhcROqJSNPIcwOzdsdB7p+8lLmrd5LRrA7jf96T01vUCzKk+GPz1BsTM6LSRyAi6UA3YH6xh5oBm4rcz4psOy4RiMgwYBhAWpp/09fm5Obz7EdreP7jtVRPrsKYQZ24/syWJFWxy0Ces3nqjYkZvicCEakF/Ae4U1X3F3+4hKf8YBY8VR0PjAdn0jnPgwQ+WrGd0ZMz2bT7MINPP4U/XNGBxrVtagjf2Dz1xsQMXxOBiFTFSQITVPW/JeySBbQocr85sMXPmIrbsvcwD0xZyntLv6NNo5q8/sszOadNw2iGkJi6jju+jwBsnnpjAuJn1ZAALwLLVfXxUnabDNwmIm/idBLvi1b/QG5+Af+ct44nZ6+mQJXfX9qeX57XmmrJNkNoVNg89cbEDD/PCHoDPwOWiMjXkW1/ANIAVPV5YDpO6eganPLRm3yM53sL1u1m5MQlrPruIP06NOb+KzvRor5NDRF1ra63L35jYoCfVUPzKLkPoOg+CtzqVwzF7Tx4hIenr+A/X2bRrF4NXvh5Ty7ueHK0Xt4YY2JSwows/mjFdu5862uyj+Yx4oI23HZRW1KrJUzzjTGmVAnzTdiqYU1Ob1GPUQM60LaxTQ1hjDGFEiYRpDesycs39wo6DGOMiTlWImOMMQnOEoExxiQ4SwTGGJPgLBEYY0yCs0RgjDEJzhKBMcYkOEsExhiT4CwRGGNMghNnup/wEJEdQAkT2bvSENjpYThBsrbEpnhpS7y0A6wthVqqaqOSHghdIqgMEVmoqj2DjsML1pbYFC9tiZd2gLXFDbs0ZIwxCc4SgTHGJLhESwTjgw7AQ9aW2BQvbYmXdoC1pUwJ1UdgjDHmhxLtjMAYY0wxlgiMMSbBxW0iEJEkEflKRKaW8Fh1EXlLRNaIyHwRSY9+hO6V0ZahIrJDRL6O3G4JIkY3RGS9iCyJxLmwhMdFRJ6KfC6LRaR7EHGWxUU7LhCRfUU+k9FBxOmGiNQTkXdEZIWILBeRs4s9HorPBFy1JRSfi4i0LxLj1yKyX0TuLLaPp59LPK9QdgewHKhTwmO/APaoalsRGQI8ClwbzeDK6URtAXhLVW+LYjyVcaGqljYg5nKgXeR2JvBc5GcsOlE7AOaq6oCoRVNxTwIzVfVqEakGpBZ7PEyfSVltgRB8Lqq6EjgdnD8Cgc3Au8V28/RzicszAhFpDlwB/KOUXQYBL0d+fwfoKyISjdjKy0Vb4skg4BV1fA7UE5GmQQcVr0SkDnA+8CKAqh5V1b3FdgvFZ+KyLWHUF/hWVYvPpuDp5xKXiQB4ArgHKCjl8WbAJgBVzQP2AQ2iE1q5ldUWgKsip4fviEiLKMVVEQq8LyKLRGRYCY9//7lEZEW2xZqy2gFwtoh8IyIzRKRTNIMrh9bADuClyKXHf4hIzWL7hOUzcdMWCMfnUtQQ4I0Stnv6ucRdIhCRAcB2VV10ot1K2BZzdbQu2zIFSFfVLsAHHDvTiUW9VbU7zmntrSJyfrHHQ/G5UHY7vsSZ16Ur8DQwMdoBupQMdAeeU9VuwCHg/xXbJyyfiZu2hOVzASByeWsg8O+SHi5hW4U/l7hLBEBvYKCIrAfeBC4SkdeK7ZMFtAAQkWSgLrA7mkG6VGZbVHWXqh6J3H0B6BHdEN1T1S2Rn9txrnn2KrbL959LRHNgS3Sic6+sdqjqflU9GPl9OlBVRBpGPdCyZQFZqjo/cv8dnC/T4vvE/GeCi7aE6HMpdDnwpap+V8Jjnn4ucZcIVPVeVW2uquk4p1UfquoNxXabDNwY+f3qyD4x91eOm7YUuy44EKdTOeaISE0RqV34O3AJkFlst8nAzyMVEWcB+1R1a5RDPSE37RCRJoV9TiLSC+f/2a5ox1oWVd0GbBKR9pFNfYFlxXaL+c8E3LUlLJ9LEddR8mUh8PhzieeqoeOIyBhgoapOxulQelVE1uCcCQwJNLhyKtaW20VkIJCH05ahQcZ2AicD70b+HyYDr6vqTBH5NYCqPg9MB/oDa4Bs4KaAYj0RN+24GhguInnAYWBILP6hEfEbYELkMsRa4KYQfiaFympLaD4XEUkFLgZ+VWSbb5+LTTFhjDEJLu4uDRljjCkfSwTGGJPgLBEYY0yCs0RgjDEJzhKBMcYkOEsExpRTZBbLkmaCLXG7B683WEQ6Frk/R0TiYjF2ExssERgT+wYDHcvcy5gKskRg4k5k9O+0yORimSJybWR7DxH5ODJZ3HuFo7Ijf2E/ISKfRvbvFdneK7Ltq8jP9id63RJi+KeIfBF5/qDI9qEi8l8RmSkiq0XkT0We8wsRWRWJ5wUReUZEzsEZMf5nceambxPZ/RoRWRDZ/zyP3jqToBJmZLFJKJcBW1T1CgARqSsiVXEmGhukqjsiyWEccHPkOTVV9ZzIBHL/BDKAFcD5qponIv2Ah4CrXMZwH86UIDeLSD1ggYh8EHnsdKAbcARYKSJPA/nAKJz5cQ4AHwLfqOqnIjIZmKqq70TaA5Csqr1EpD9wP9CvIm+UMWCJwMSnJcBfRORRnC/QuSKSgfPlPivyRZoEFJ2b5Q0AVf1EROpEvrxrAy+LSDucmR2rliOGS3AmDPxd5H4KkBb5fbaq7gMQkWVAS6Ah8LGq7o5s/zdw6gmO/9/Iz0VAejniMuYHLBGYuKOqq0SkB85cLA+LyPs4s4QuVdWzS3taCffHAh+p6o/EWc50TjnCEOCqyGpTxzaKnIlzJlAoH+f/YXkXRio8RuHzjakw6yMwcUdETgGyVfU14C84l1tWAo0kso6tiFSV4xcmKexHOBdnJsd9ONOTb448PrScYbwH/KbIbJfdyth/AdBHRE4SZ2r0opegDuCcnRjjC/tLwsSjzjidqwVALjBcVY+KyNXAUyJSF+ff/hPA0shz9ojIpzjrQhf2G/wJ59LQb3Gu2ZfH2MjxF0eSwXqg1LVyVXWziDwEzMeZV34Zzsp54KxF8YKI3I4zg6YxnrLZR03CE5E5wO9UdWHAcdRS1YORM4J3gX+qavFFy43xnF0aMiZ2/FFEvsZZ6GYdMb6UookfdkZgjDEJzs4IjDEmwVkiMMaYBGeJwBhjEpwlAmOMSXCWCIwxJsH9fzHpR270gQJMAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_points = np.linspace(4, 7, 10)\n",
    "y_ = -(perceptron.w[0] * x_points + perceptron.b) / perceptron.w[1]\n",
    "plt.plot(x_points, y_)\n",
    "\n",
    "plt.plot(data[:50, 0], data[:50, 1], 'bo', color='blue', label='0')\n",
    "plt.plot(data[50:100, 0], data[50:100, 1], 'bo', color='orange', label='1')\n",
    "plt.xlabel('sepal length')\n",
    "plt.ylabel('sepal width')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### scikit-learn实例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sklearn\n",
    "from sklearn.linear_model import Perceptron"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'0.23.1'"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sklearn.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Perceptron()"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf = Perceptron(fit_intercept=True, \n",
    "                 max_iter=1000, \n",
    "                 shuffle=True)\n",
    "clf.fit(X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 23.2 -38.7]]\n"
     ]
    }
   ],
   "source": [
    "# Weights assigned to the features.\n",
    "print(clf.coef_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-5.]\n"
     ]
    }
   ],
   "source": [
    "# 截距 Constants in decision function.\n",
    "print(clf.intercept_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x17815902248>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画布大小\n",
    "plt.figure(figsize=(10,10))\n",
    "\n",
    "# 中文标题\n",
    "plt.rcParams['font.sans-serif']=['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "plt.title('鸢尾花线性数据示例')\n",
    "\n",
    "plt.scatter(data[:50, 0], data[:50, 1], c='b', label='Iris-setosa',)\n",
    "plt.scatter(data[50:100, 0], data[50:100, 1], c='orange', label='Iris-versicolor')\n",
    "\n",
    "# 画感知机的线\n",
    "x_ponits = np.arange(4, 8)\n",
    "y_ = -(clf.coef_[0][0]*x_ponits + clf.intercept_)/clf.coef_[0][1]\n",
    "plt.plot(x_ponits, y_)\n",
    "\n",
    "# 其他部分\n",
    "plt.legend()  # 显示图例\n",
    "plt.grid(False)  # 不显示网格\n",
    "plt.xlabel('sepal length')\n",
    "plt.ylabel('sepal width')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**注意 !**\n",
    "\n",
    "在上图中，有一个位于左下角的蓝点没有被正确分类，这是因为 SKlearn 的 Perceptron 实例中有一个`tol`参数。\n",
    "\n",
    "`tol` 参数规定了如果本次迭代的损失和上次迭代的损失之差小于一个特定值时，停止迭代。所以我们需要设置 `tol=None` 使之可以继续迭代："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1781588e608>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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VVzs9HRNmBD6gfVSO4GOnTGmwFobMIFqjJeIiEiMycxU0IpVOtUoIiIiEiEKXiIiIiIRouAlIiIiEiEKXiIiIiIRouAlIuICt++1JxJItNwkuy7OppbBgweHrpBaUvASEYmwynvtFRWBtSfvtafwJbW2yQevpsGsBGe6KbJvnnDfJLsuoqmW2lDwEhGJsEjea0/i0CYf5GVBSRFgnWleVljC1+DBg/nZz37Gd77zna+1Vzp69Cg33HADgwYN4uabb6asrCzguiZMmMCrr74KwNNPP83cuXMpKSlhyJAhDBo0iPvuuy/o61b3GqfWUlpayh133MGVV17JDTfcQElJCceOHePOO+/kqquuIjMzk+PHjwesL9hywfbBmVLwEhGJsEjea0/i0LJHoLxKci8vcdpDLJQ3yR46dChvvfUWAB999BHXX399wJtkB3rdQK8RSE5ODj179uSTTz7h1ltvZeXKlQFvsB1IsOVqsw/qQhdQFRGJsJQU5/RioHaRGpUESejB2s9CKG+SDbB582YOHjxIixYtaNy4cdCbZFd93UCvEciaNWu49dZbARg5ciQA06dP/9oNtgMJdCPu2u6DulCPl4hIhEXbvfYkxniDJPRg7WchlDfJBujfvz/PPvssP/jBDwCC3iS76uvW9jUuueQSFi1aBMCvf/1rJk+eHPAG24EEW642+6AuFLxERCIsMxNyciA1FYxxpjk5ugWM1FLPCeCpktw9XqfdBbW9STbA0KFDefbZZ7nhhhsAgt4k+0xfY+zYsSxevJjBgwezePFihg8fHvAG24HUdrmzpZtki4iIuKyuN8lmk88Z01VS7PR09ZwAnZTc3aCbZIuIiMS7TpkKWjFKpxpFRESiQCycgZLTnckxU/ASERFxWXJyMnv27FH4iiHWWvbs2UNycnKdnqdTjSIiIi7r2LEjmzdvZteuXW6XInWQnJxMx44d6/QcBS8RERGXJSUl0alTJ7fLkAjQqUYRERGRCFHwEhEREYkQBS8RERGRCFHwEhEREYkQBS8RERGRCFHwEhEREYkQBS8RERGRCFHwEhEREYkQBS8RERGJe7sOHXO7BEDBS0REROLcnEVf8o1n3qegaK/bpSh4iYiISPya/PFGHvzncvqlteLS9s3cLkf3ahQREZH4Y63lj++u57n31vPdbufy7B29aJjocbssBS8RERGJLxUVlifeWMX0zwoZ2rcjT9/SnURPdJzkU/ASERGRuFFWXsGD/1zOy4u3cM8VnXj0e5eSkGDcLusrCl4iIiISF0pPlPOj2Ut4Z9UOHrjmIn70rc4YEz2hCxS8REREJA4cOVZG1sx8Pt2wh199/zJGXdHJ7ZICUvASERGRmLa/5Dijpi9i2Zf7+f3Qngzp29HtkoJS8BIREZGYtfNgKcOn5LFp9xEmZvblum7nul1StRS8REREJCZ9ubeEYVMWsuvQMaaO7MeVXdq4XVKNFLxEREQk5qzfcYhhUxZy9Hg5uWMy6JPS0u2SakXBS0RERGLK8s37GTE1D09CAi+NGxgVV6SvLQUvERERiRkLNu5hzIx8mjdKwjcmg7Q2jd0uqU4UvERERCQmvL9mB+NzF9OxZSNyx2TQvnkjt0uqMwUvERERiXqvLd3C/8xZxqXtmzF9VD9aN2nodklnRMFLREREolrugiJ++dpK+qW1YsqIdJomJ7ld0hlT8BIREZGoNXHeBp55ey1XX3IOEzP7kJzkcbuksxIdt+oWEYkgnw/S0iAhwZn6fG5XJCJVWWv5zVtreObttXy/53lMGt435kMXqMdLROoZnw+ysqCkxJkvKnLmATIz3atLRE4qr7A89tpKfAuLuSsjhSdv7IYnIbpudn2m1OMlIvXKI4+cDF2VSkqcdhFx34nyCh54aSm+hcXce9WFTLgpfkIXqMdLROqZ4uK6tYtI5JSeKCfbt5j31+zkwesuJntwZ7dLCjn1eIlIvZKSUrd2EYmMQ6UnuHtqHh+s3clTN3WLy9AFCl4iUs9MmABe7+ltXq/TLiLu2HvkOHf9bSGLi/bx7O29GDYg1e2SwkbBS0TqlcxMyMmB1FQwxpnm5GhgvYhbth04ym2T5rNuxyFy7u7Ljb06uF1SWGmMl4jUO5mZCloi0aBw9xEyJy/kwNETzLinPwMuaO12SWGn4CUiIiIRt3rbQYZPyaO8ooJZYzPo0bGF2yVFhIKXiIiIRNTi4n2MnJpHowYeZo8dSJd2Td0uKWIUvERERCRiPlm/m6yZ+bRt2pDc0Rmc38pb85PiiIKXiIiIRMTbK7fzo9lL6NSmMTNH9+ecZslulxRxCl4iIiISdv8o2MyD/1hGj44tmD6qHy28DdwuyRUKXiIiIhJW0z7dxOOvr+KKzq3JGZ5O44b1N37U3y0XERGRsLLW8tx7G/jju+v49mXteO7O3iQnedwuy1UKXiIiIhJy1lqeenM1Uz7ZxC19OvDMrT1I9Oi67QpeIiIiElJl5RU8/PIK5hZsZuTlaTx2w2UkJBi3y4oKCl4iIiISMsfKyvnx7KW8/fl2fvStLjxwTReMUeiqpOAlIiIiIVFyvIxxMwv4eP1uHv3epYz5xgVulxR1FLxERETkrB0oOcE9MxaxpHgfz9zag9v6ne92SVFJo9xEpFZ8PkhLg4QEZ+rzuV2RiESLXYeOcXvOfJZv3s9f7+qj0FUN9XiJSI18PsjKgpISZ76oyJkHyMx0ry4Rcd/mfSUMn5LH9gOlTB7Rj6suaut2SVFNPV4iUqNHHjkZuiqVlDjtIlJ/bdh5mKEvzGf34WPkjumv0FUL6vESkRoVF9etXUTi38otB7h7ah4JBv6eNYCu5zV3u6SYoB4vEalRSkrd2kUkvuVt2sudOQtolORhzriBCl11oOAlIjWaMAG83tPbvF6nXUTqlw/W7uTuqQtp26whc+8dyAVtm7hdUkxR8BKRGmVmQk4OpKaCMc40J0cD60XqmzeWb2XsjHwubNuEOeMGcl6LRm6XFHM0xktEaiUzU0FLpD6bnVfML15ZQXpqS6aM7Eez5CS3S4pJCl4iIiJSrZyPvuDX/17DVRe15YVhfWnUwON2STFLwUtEREQCstby+3fW8tcPvuB7Pdrzx9t60SBRo5TOhoKXiIiIfE1FheVX//qcmQuKuKPf+Uy4uTueBN3s+mwpeImIiMhpTpRX8LO5y3h16VayBl3Aw9+9BGMUukJBwUtERES+UnqinPtnLebd1Tv52XcuJnvwhQpdIaTgJSIiIgAcPlbG2Bn5zN+4hydv7MrwgWlulxR3FLxERESEfUeOM3JaHiu3HuSPt/fk5t4d3S4pLil4iYiI1HM7DpYybPJCivaW8MKwvlx7WTu3S4pbCl4iIiL1WPGeEjKnLGDv4eNMH9WPyy9s43ZJcU3BS0REpJ5au/0Qw6cs5Hh5Bb6xA+h1fgu3S4p7Cl4iIiL10NIv9zNyWh4NPAnMGTeQi9o1dbukekGXnxURiVE+H6SlQUKCM/X53K5IYsVnX+wm828LaJqcyD/uvVyhK4LCEryMMe2MMUuqeXyKMWa+MebRcLy+iEi88/kgKwuKisBaZ5qVpfAlNfvvqh2MnLaIDi0b8Y97LyeltdftkuqVcPV4/R5oFOgBY8wtgMdaOxC4wBjTJUw1iIjErUcegZKS09tKSpx2kWBeWbKZe3MLuPTcpryUNZB2zZLdLqneCXnwMsZcDRwBtgdZZDAwx//9O8CVQdaTZYzJN8bk79q1K9RliojEtOLiurWLvDi/kAdeWkb/tFb4xg6gZeMGbpdUL4U0eBljGgC/BB6qZrHGwBb/93uBgBcLsdbmWGvTrbXpbdu2DWWZIiIxLyWlbu1Sf1lr+esHG3jstc+55tJ2TBvVjyYN9dk6t4S6x+shYKK1dn81yxzm5GnIJmGoQUQk7k2YAN4qQ3O8XqddpJK1lqffWsPv/rOWm3t34PlhfUhO8rhdVr0W6tBzDXCfMWYe0MsYMznAMgWcPL3YEygMcQ0iInEvMxNyciA1FYxxpjk5TrsIQHmF5eGXV5Dz0UbuHpjK/w3tSZJHfR1uM9ba8KzYCV/ZwF3W2kdPaW8GfAy8B3wXGGCtPVDdutLT021+fn5Y6hQREYk3x8sqeOClpby5Yhv3f7Mz//PtizDGuF1WvWGMKbDWpgd6LGwnea21g/3fPlql/aAxZjBwLfBMTaFLREREau/o8XLuzS3gw3W7+MX1l5A16EK3S5JTuDK6zlq7j5OfbBQREZEQOFh6gtHTF5FftI/f3NKdO/rr0xbRRh9rEBERiQO7Dx9jxNQ81u04xJ/v7M0NPc5zuyQJQMFLREQkxm3df5Rhkxey9cBR/nZ3OoMvPsftkiQIBS8REZEYtnHXYYZPyePg0RPMHJ1Bv7RWbpck1VDwEhERiVGfbz3AiKl5WAuzswbQrUNzt0uSGih4iYiIxKD8wr2Mmr6Ipg0TmTkmgwvbNnG7JKkFBS8REZEY89G6XYybWcC5zZPJHZNBhxaNan6SRAUFLxERkRjy7xXb+PHfl9D5nKa8eE9/2jZt6HZJUgcKXiIiIjFizqIveejl5fROacnUkf1o3ijJ7ZKkjhS8REREYsDkjzfy1Jur+UaXNkwa3hdvA/0Jj0U6aiIiIlHMWssf/7uO597fwHe7ncuzd/SiYaLH7bLkDOk25SISU7KzITERjHGm2dluVyQSPhUVlsdfX8Vz72/gtvSO/PnO3gpdMU49XiISM7Kz4fnnT86Xl5+cnzjRnZpEwqWsvIIH/7mclxdvYfSVnXj0e5dijHG7LDlLxlrrdg01Sk9Pt/n5+W6XISIuS0x0wlZVHg+UlUW+HpFwKT1Rzo9mL+GdVTv46bUX8cOrOyt0xRBjTIG1Nj3QY+rxEpGYESh0VdcuEouOHCsja2Y+n27Yw//7/mWMvKKT2yVJCCl4iUjM8HiC93iJxIP9JccZOW0RK7Yc4P+G9uTWvh3dLklCTIPrRSRmZGXVrV0kluw8WMrtkxawautBJmb2UeiKU+rxEpGYUTmAPifH6fnyeJzQpYH1Euu+3FvCsCkL2XXoGNNG9eOKzm3cLknCRMFLRGLKxIkKWhJf1u84xLApCyk9UUHumAz6pLR0uyQJIwUvERERlyzfvJ8RU/NI9CTw0rgBXHJuM7dLkjBT8BIREXHBgo17GDMjnxbeJHJHZ5DWprHbJUkEKHiJiIhE2PtrdjA+dzHnt/KSOzqDc5snu12SRIiCl4iISAS9tnQL/zNnGZe2b8aMe/rTqnEDt0uSCFLwEhERiZDcBUX88rWV9E9rxeQR6TRNTnK7JIkwBS8REZEImDhvA8+8vZarLzmHiZl9SE7SlX/rIwUvERGRMLLW8tu31/LCh19wY6/z+P3QniR5dP3y+krBS0REJEzKKyy/fG0lsxYWk5mRwpM3diMhQTe7rs8UvERERMLgRHkFP52zjNeXbSV78IX87DsXY4xCV32n4CUiIhJipSfKyfYt5v01O/n5dZcwfvCFbpckUULBS0REJIQOlZ5g9Ix8FhXuZcLN3cjMSHW7JIkiCl4iIiIhsvfIcUZMzWP1toP86Y7e/KDneW6XJFFGH6sQqQeuuQaMOfl1zTVuVyQ+H6SlQUKCM/X53K5Izta2A0e5bdJ81u04RM7dfRW6JCAFL5E4d8018N57p7e9957Cl5t8PsjKgqIisNaZZmUpfMWywt1HGPL8fLYfKOXFe/pz9SXt3C5JopSx1rpdQ43S09Ntfn6+22WIxKTqPkQVAz/+cSktzQlbVaWmQmFhpKuRs7V620GGT8mjvKKCF+/JoHvH5m6XJC4zxhRYa9MDPaYxXiIiEVZcXLd2iV6Li/cxcmoe3gaJ/D1rIJ3Paep2SRLldKpRRCTCUlLq1i7R6ZP1uxk2eSGtGjdg7r0KXVI7Cl4ice5b36pbu4TfhAng9Z7e5vU67RIb3l65nXumLyKllZc59w7k/Fbemp8kgoKXSNx7992vh6xvfctpF3dkZkJOjjOmyxhnmpPjtEv0+0fBZrJ9BXTt0IyXsgZyTtNkt0uSGKLB9SIiIrU07dNNPP76Kq7s3IZJw/vSuKGGSsvXaXC9iIjIWbDW8tx7G/jju+v4Ttd2PHdnbxometwuS2KQgpeIiEg1KiosT725mqmfbuLWPh357a3dSfRopI6cGQUvERGRIMrKK3j45RXMLdjMyMvTeOyGy0hIqObieCI1UPASEREJ4FhZOT+evZS3P9/Oj7/VhZ9c0wVT3RWJRWpBwUtERKSKkuNljJtZwMfrd/PLGy5j9JWd3C5J4oSCl4iIyCkOlJzgnhmLWFK8j2eG9OC29PPdLl0mY9MAACAASURBVEniiIKXiIiI365Dxxg+ZSEbdx1hYmYfruvW3u2SJM4oeImIiACb95UwfEoe2w+UMmVkOt/o0tbtkiQOKXiJiEi9t2HnYYZPWciRY2XkjulP39RWbpckcUrBS0RE6rWVWw5w99Q8Egz8PWsgl53XzO2SJI4peImISL2Vt2kvo6cvolmjJHLHZNCpTWO3S5I4p0vvitQDPh+kpUFCgjP1+WK3jmjZFol9H6zdyfApC2nbrCFz7x2o0CURoR4vkTjn80FWFpSUOPNFRc48QGZmbNURLdsise/1ZVt54KWlXNK+KTNG9ad1k4ZulyT1hLHWul1DjdLT021+fr7bZYjEpLQ0J6BUlZoKhYWxVUe0bIvEttl5xfzilRX0S23F5JHpNEtOcrskiTPGmAJrbXqgx9TjJRLniovr1h7NdUTLtkjsmvThFzz91hoGX9yW5zP70qiBx+2SpJ7RGC+ROJeSUrf2aK4jWrZFYo+1lt/9Zw1Pv7WGG3q0J2d4ukKXuELBSyTOTZgAXu/pbV6v0x5rdUTLtkhsqaiwPPba5/z1gy+4s38Kf7qjNw0S9edP3KF3nkicy8yEnBxnHJQxzjQnJ/KD0UNRR7Rsi8SOE+UV/HTOUmYuKGLcVRfw65u74Ukwbpcl9ZgG14uISFwqPVHO/bMW8+7qnTx43cVkD+7sdklST2hwvYiI1CuHj5UxdkY+Czbt4cmbujF8QKrbJYkACl4iIhJn9h05zshpeazcepA/3taLm3p3cLskka8oeImISNzYcbCUYZMXUrS3hEnD+nLNZe3cLknkNApeIiISF4r3lJA5ZQF7Dx9nxqj+DLywtdsliXyNgpeIiMS8tdsPMXzKQo6XVzBr7AB6nt/C7ZJEAlLwEhGRmLb0y/2MmJpHw8QE5owbyEXtmrpdkkhQCl4iIhKzPtuwm7Ev5tO6SUNyR2eQ0tpb85NEXKTgJSIiMemdz7dz/+wldGrdmJmj+3NOs2S3SxKpkYKXiIjEnFeWbOZ/5y6nW4fmzBjVjxbeBm6XJFIrumWQiIjElBfnF/LAS8vI6NQK35gMhS6JKerxEhGRmGCt5a8fbOD376zj2sva8ec7e5Oc5HG7LJE6UfASEZGoZ63l6bfWkPPRRm7p3YFnhvQg0aOTNhJ79K6VqOTzQVoaJCQ4U5/P7YrOTCi2I172hciZKq+wPPzyCnI+2siIgan8fmhPhS6JWerxkqjj80FWFpSUOPNFRc48QGame3XVVSi2I172hciZOl5WwQMvLeXNFdv44dWd+em1F2GMcbsskTNmrLVu11Cj9PR0m5+f73YZEiFpaU7AqCo1FQoLI13NmQvFdsTLvhA5E0ePl3NvbgEfrtvFI9dfythBF7hdkkitGGMKrLXpgR5Tj5dEneLiurVHq1BsR7zsC5G6Olh6gtHTF1FQtI/f3tqd2/uluF2SSEjoJLlEnZQgv1+DtUerUGxHvOwLkbrYffgYd+YsYOmX+/nLXX0UuiSuKHhJ1JkwAbxV7vrh9TrtsSQU2xEv+0KktrbuP8ptL8zni12HmTyiH9d3b+92SSIhpeAlUSczE3JynHFMxjjTnJzYG0weiu2Il30hUhsbdx1m6Avz2XX4GDNHZ3DVRW3dLkkk5DS4XkREXPf51gOMmJqHtfDi6P50Pa+52yWJnDENrhcRkaiVX7iXUdMX0bRhIjPHZHBh2yZulyQSNgpeIiLimg/X7WLczHzOa96ImWMy6NCikdsliYSVgpeIiLji3yu28eO/L6HLOU15cXR/2jRp6HZJImGn4CUiIhE3Z9GXPPTycvqktGTKyH40b5TkdkkiEaHgJSIiETX544089eZqBl3UlheG9cHbQH+KpP7Qu11ERCLCWssf/7uO597fwPXdz+XZ23vTIFFXNZL6RcFLRETCrqLC8sQbq5j+WSG3p5/Pr2/pjidBN7uW+kfBS0REwqqsvIIH/7mclxdvYew3OvGL6y/FGIUuqZ8UvEREJGxKT5Tzo9lLeGfVDv732xdx3zc7K3RJvabgJSIiYXHkWBlZM/P5dMMeHv9BV0ZcnuZ2SSKuU/ASEZGQ219ynJHTFrFiywH+cFtPbunT0e2SRKJCWIKXMaYV0BdYYq3dHY7XEBGR6LTzYCnDp+SxafcRns/sw7e7nut2SSJRI+Sf4zXGtATeAPoDHxhjvnZ7eWNMojGm2Bgzz//VPdR1iMSL7GxITARjnGl2tjvr8PkgLQ0SEpypz1f3dUSLeNqWaPPl3hKGTprPl/tKmDaqn0KXSBXh6PHqAfzUWrvAH8L6AP8JsMxsa+3Pw/D6InEjOxuef/7kfHn5yfmJEyO3Dp8PsrKgpMSZLypy5gEyM2u3jmgRT9sSbdbvOMSwKQspPVGBb0wGvVNaul2SSNQx1trwrNiYQcBTwA3W2oNVHssG7gOOACuAcdbasmDrSk9Pt/n5+WGpUySaJSY6QakqjwfKgv7EhH4daWlOQKkqNRUKC2u3jmgRT9sSTZZv3s+IqXkkehLIHZ3Bxec2dbskEdcYYwqstemBHgvLJYON81nh24F9wIkAiywCrrHW9geSgOsDrCPLGJNvjMnftWtXOMoUiXqBAlN17eFaR3Fx3dqjWTxtS7RYsHEPd/1tIU2SE/nHvQMVukSqEZbgZR33AcuBHwRYZLm1dpv/+3ygS4B15Fhr06216W3bfm2YmEi94PHUrT1c60hJqVt7NIunbYkG763ewYipebRvnszccZeT2rqx2yWJRLVwDK7/uTHmbv9sC2B/gMVmGmN6GmM8wE3AslDXIRIPKsce1bY9XOuYMAG83tPbvF6nPdbE07a47bWlWxg3s4CLz23KnHEDObd5stsliUS9cPR45QDDjTEfAR5gszHmqSrLPAHMBJYC862174ahDpGYN3EijB9/snfK43HmazsoPlTryMyEnBxnHJQxzjQnJzYHo8fTtrgpd0ERP3lpKelpLfGNyaBl4wZulyQSE8I2uD6UNLheRCR6TJy3gWfeXss1l57DX+7qQ3JSHc5bi9QD1Q2u15XrRUSkVqy1/Pbttbzw4Rfc2Os8fj+0J0mesAwVFolbCl4iIlKj8grLL19byayFxQwbkMITP+hGQoJudi1SVwpeIiJSrRPlFfx0zjJeX7aV7MEX8rPvXIxz1SARqSsFLxERCero8XKyfQV8sHYXD333Eu696kK3SxKJaQpeIiIS0KHSE4yekc+iwr38+ubu3JWhi52JnC0FLxER+Zo9h48xYloea7Yd4rk7evP9nue5XZJIXFDwEhGR02w7cJRhkxeyed9R/nZ3Ot+85By3SxKJGwpeIiLylcLdR8icvJCDR08wc3QG/Tu1crskkbii4CUiIgCs3naQ4VPyqLCW2VkD6NahudslicQdXflOREQoKNrH7ZPmk+QxzBk3UKFLJEzU4yUiUs99sn43Y1/Mp12zhuSOyaBjS2/NTxKRM6IeL4lKPh+kpUFCgjP1+dypIzsbEhOdmyknJjrzsVhDKPanjkl8envldu6ZvojU1l7m3DvwzELXJh+8mgazEpzpJpfeHCKxwFob9V99+/a1Un/k5lrr9VoLJ7+8Xqc9ksaPP72Gyq/x42OrhlDsTx2T+DQ3/0vb6aE37M1//cTuP3L8zFayMdfav3ut9XHy6+9ep12kngLybZBMY5zHo1t6errNz893uwyJkLQ0KCr6entqKhQWRq6OxEQoL/96u8cDZWWxU0Mo9qeOSfyZ9ukmHn99Fd/o0oZJw/vibXCGI09eTYOSAG8ObyrcVHg2JYrELGNMgbU2PdBjGuMlUae4uG7t4RLoD3x17dFaQyj2p45J/LDW8qf31vPsu+u5ruu5/OnOXjRM9Jz5CkuCvAmCtYvUcxrjJVEnJchdSYK1h4snyN+iYO3RWkMo9qeOSXyoqLA8+cZqnn13PUP6duQvd/U+u9AF4A3yJgjWLlLPKXhJ1JkwAbxVxvd6vU57JGVl1a09WmsIxf7UMYl9ZeUVPPjP5Uz9dBOjrkjjmVt7kOgJwZ+AnhPAU+XN4fE67SLydcEGf0XTlwbX1z+5udamplprjDON9CDuSuPHW+vxOAO4PR53BnGHooZQ7E8dk9hVeqLMjnsx36b+/A37x/+utRUVFaF9gY251r6Saq3POFMNrJd6Dg2uFxGpn0qOlzFuZgEfr9/NYzdcxj1XdnK7JJG4p8H1IiL10IGSE4yansfSL/fzuyE9GJp+vtslidR7Cl4iInFo16FjDJ+ykI27jjAxsw/XdWvvdkkigoKXiEjc2byvhGGTF7Lj4DGmjuzHlV3auF2SiPgpeImIxJENOw8zfMpCjhwrI3dMBn1TW7pdkoicQsFLRCROrNxygLun5pFgDC+NG8il7Zu5XZKIVKHgJSISB/I27WX09EU0a5RE7pgMOrVp7HZJIhKAgpeISIz7YO1O7p1ZQMeWjcgdk0H75o3cLklEglDwEhGJYa8v28oDLy3lkvZNmTGqP62bNHS7JBGphoKXiEiMmp1XzC9eWUG/1FZMHplOs+Qkt0sSkRooeImIxKBJH37B02+t4ZsXt2ViZl8aNdCdwkVigYKXiEgMsdbyu/+sZeK8L7ihR3v+cFsvGiSG4GbXIhIRCl4iIjGiosLy2L9WkrugmDv7p/DUTd3wJBi3yxKROtC/SSJRzueDtDRISHCmPp876xB3nSiv4KdzlpK7oJh7r7qQX9+s0BVym3zwahrMSnCmm/SDIqGnHi+RKObzQVYWlJQ480VFzjxAZmbk1iHuKj1Rzv2zFvPu6p08eN3FZA/u7HZJ8WeTD/KyoNz/g1JS5MwDdNIPioSOsda6XUON0tPTbX5+vttliERcWpoTlKpKTYXCwsitQ9xz+FgZY2YsYuGmvTxxYzeGD0h1u6T49GqaE7aq8qbCTYWRrkZinDGmwFqbHugx9XiJRLHi4rq1h2sd4o59R44zcloeK7ce5Nnbe3Fjrw5ulxS/SoL8QARrFzlDGuMlEsVSUurWHq51SORtP1DKbZPms2b7IXKG91XoCjdvkB+IYO0iZ0jBSySKTZgAXu/pbV6v0x7JdUhkFe8pYeikz9i6/yjTR/XnW5e2c7uk+NdzAniq/KB4vE67SAgpeIlEscxMyMlxxmMZ40xzcuo2KD4U65DIWbv9EENe+IzDpWXMzhrAwAtbu11S/dApE/rnOGO6MM60f44G1kvI1Ti43hhzGfADoEFlm7X2iTDXdRoNrheR+mBJ8T5GTltEclICuaMz6NKuqdslicgZONvB9XOA3wBfhrQqERH5ymcbdjPmxXzaNGmIb0wG57fy1vwkEYk5tQleO4DZ1trycBcjIlIfvfP5du6fvYROrRszc3R/zmmW7HZJIhImQYOXMeZu/7fLgA+MMbOBIwDW2hcjUJuISNx7efFmfvaP5XTv0Jzpo/rRwtug5ieJSMyqrser8l4Uy/xflW3Rf8VVEZEYMOOzQn71r8+5onNrcoan07ihLq0oEu+C/pRba2cAGGNaW2v3VLYbY26LRGEiIvHKWstfP9jA799Zx7WXtePPd/YmOcnjdlkiEgG1uZzE3Crz94WjEBGR+sBay6//vZrfv7OOW/p04PnMPgpdIvVIdWO8rgIGA2nGmMf8zY2BfRGoS0Qk7pRXWH7x8gpeyv+SkZen8dgNl5GQYGp+oojEjeoGFBQC84CbgA/9bUeBJeEtSUQk/hwvq+CBl5by5opt/Ojqzjxw7UUYo9AlUt9UN8arCCgyxkyz1n4YbDkREane0ePl3JtbwIfrdvHo9y5lzDcucLskEXFJbS4nsf+U7wFdTkJEpLYOHD3B6OmLWFy8j2du7cFt/c53uyQRcVFtLidxJ1AM5AO9gS6AgpeISA12Hz7G3VPyWL/zEH+5qw/Xd2/vdkki4rKgn2q01s7wX1IiyVqbZa3NsdaOr+45Evt8PkhLg4QEZ+rzxW4d2dmQmOjcGDox0ZmPRdFyTKRutuw/ym0vzGfj7sNMHtEvekPXJh+8mgazEpzpJr3Bzor2Z/SJsmNSm6v1HTDG/AHnIqpdgUPhLUnc4vNBVhaUlDjzRUXOPEBmZmzVkZ0Nzz9/cr68/OT8xImhqzXcouWYSN1s3HWYYZMXcuhYGbmjM0hPa+V2SYFt8kFeFpT732AlRc48QCe9wepM+zP6ROExMdZWfyF6Y0wicAvQCeeU4z+ttccjUNtX0tPTbX5+fiRfsl5KS3P+sFeVmgqFhbFVR2KiE7aq8nigrOxsqousaDkmUnufbz3A3VPyAHhxdH+6ntfc5Yqq8Wqa84eoKm8q3FQY6Wpin/Zn9HHpmBhjCqy16YEeq7HHy1pbBswJeVUSdYqL69YezXUECl3VtUeraDkmUjv5hXsZNX0RTRsmkjsmgwvaNnG7pOqVBHkjBWuX6ml/Rp8oPCYaryVfSUmpW3s01+EJciHwYO3RKlqOidTsw3W7GDZlIW2bNGTu+MujP3QBeIO8kYK1S/W0P6NPFB6ToMHLP64LY8wHxpj3/V8fGGPej1x5EkkTJoDXe3qb1+u0x1odleOgatseraLlmEj1/r1iG2NmLOKCNk2Yc+9AOrRo5HZJtdNzAniqvME8Xqdd6k77M/pE4TGp7lONP/VPv2mtvdr/9U1r7dWRK08iKTMTcnKc8UPGONOcnMgP4g5FHRMnwvjxJ3u4PB5nPpYG1kP0HBMJbs6iL7l/1mJ6dmzB7KwBtGnS0O2Saq9TJvTPcca7YJxp/xwNBD9T2p/RJwqPSY2D66OBBteLSDSa/PFGnnpzNVdd1JYXhvWlUYMYO5ctImFxVoPrjTGLgNVAAbAYWGKtPRzaEkVEYoe1lj/+dx3Pvb+B73Vvzx9v70WDRA2ZFZGa1eY3xXXAu8A1wH+ARWGtSEQkilVUWB5/fRXPvb+B29PP57k7eyt0iUit1eYCqmuBT4HXgfv9N88WEal3ysorePAfy3l5yRbGfqMTv7j+UowxNT9RRMSvNv+mdQHmAjcA640xW8NbkohI9Ck9Uc5432JeXrKF//32RQpdInJGahO8XgK6AT6gm7X2vPCWJCISXQ4fK+Oe6Yv476odPHFjV+6/uotCl4ickdpcuf7bkShERCQa7S85zshpi1ix5QB/uK0nt/Tp6HZJIhLDajPGS0SkXtp5sJThU/LYtOcIz2f24dtdz3W7JBGJcQpeIiIBfLm3hMzJC9l9+BjTR/bj8s5t3C5JROKAgpeISBXrdxxi2JSFHCurYNbYAfQ6v4XbJYlInFDwEhE5xfLN+xkxNY8kTwIvZQ3k4nObul2SiMQRBS8REb/5X+xh7Iv5tGycRO7oDFJbN3a7JBGJMwpeIiLAe6t3MN63mNRWXnLHZNCuWbLbJYlIHAp6HS9jzAfGmPerfH1gjHk/kgVK/eTzQVoaJCQ4U58vNuvIzobERDDGmWZnh6NKOVuvLd3CuJkFXHpuU+aMG6jQJQKQlw2zE2GWcaZ5Lv0C2+SDV9NgVoIz3eTSH4QQCdrjZa39ZiQLEank80FWFpSUOPNFRc48QGZm7NSRnQ3PP39yvrz85PzEiaGtVc7czAVFPPbaSjI6tWLyiH40aagTASLkZcOGU36B2fKT8/0j+Atskw/ysqDc/4u4pMiZB+gUwT8IIWSstW7XUKP09HSbn5/vdhkSIWlpTsipKjUVCgtjp47ERCdsVeXxQFnZ2VYnofDXDzbwu/+s5ZpLz+Evd/UhOcnjdkki0WF2ohO2qjIeuDOCv8BeTXPCVlXeVLipMHJ11JExpsBamx7osRr/tTPGeIA+QCN/Uwdr7ewQ1idymuLiurVHax2BQld17RI51lp+8/YaJn24kZt6ncfvhvYkyVObO6iJ1BOBQld17eFSEuQXbrD2GFCbPvV/AIeATsBWoCWg4CVhk5ISuKcpJSW26vB4gvd4iXvKKyyPvrqS2XnFDB+QyuM/6EpCgu67KHIa4wne4xVJ3pQgPV4R/oMQQrX5F68NMArYaa29nZM9XyJhMWECeL2nt3m9Tnss1VE5Hqy27RJ+x8sq+PHflzA7r5j7vnkhT9yo0CUS0IVBflEFaw+XnhPAU+UXscfrtMeo2gSvYuA24Jgx5mGgWXhLkvouMxNycpyxVMY405ycyA6sD0UdEyfC+PEne7g8HmdeA+vdcfR4OeNm5vPG8m08/N1L+Nl3LsEYhS6RgPpPhM7jT/ZwGY8zH8mB9eAMoO+f44zpwjjT/jkxO7AeajG43hiTALQGTgC3AJ9aa9dGoLavaHC9iJyNg6UnGDM9n0VFe/n1zd25s3/snqYQkeh3VoPr/a4E0oANwLoQ1SUiEnZ7Dh9jxLQ81mw7xHN39Ob7Pc9zuyQRqcdqc6rx78C3gCPA9UBsX7lMROqNbQeOctuk+WzYeZi/jUhX6BIR19Wmx+sca+1tlTPGmA/CWI+ISEhs2n2EYZMXcvDoCV68J4P+nVq5XZKISK2CV4kx5iGgAOgPHDDGDLLWfhTe0kREzszqbQcZPiWPCmuZnTWAbh2au12SiAhQu1ONC4GGwOU4QW0JMDiMNYmInLGCon3cPmk+SR7DnHEDFbpEJKrU2ONlrX3cGNMN6IBzaYkvrbWHw16ZiEgdfbx+F1kvFtCuWUNyx2TQsaW35ieJiERQjT1expg/A48DTwMXALPCXZSISF29vXIbo6fnk9ray9x7L1foEpGoVJtTjd2ttbcC+621bwLqtxeRqDI3/0uyfYvp1qEZL2UNpG3Thm6XJCISUG0G1+8yxjwGtDTGjAC2h7kmEZFam/rJJp54YxXf6NKGScP74m1Q28sTiohEXm16vO4GDgDzcXq7RoW1IhGRWrDW8uy763jijVVc1/VcJo9IV+gSkahXm99Sx4BpwFGcK9hH+NbkIiKnq6iwPPnmKqZ9WsjQvh15+pbuJHpq83+kiIi7avObai4wCPgDMAZ4paYnGGNaGWOuNca0Ocv6REROU1ZewYP/XM60Twu554pO/PbWHgpdIhIzavPbqrW19g2gi7U2E2hU3cLGmJbAGzgXW/3AGNM2yHJTjDHzjTGP1rVoCczng7Q0SEhwpr4zuLlTKNYRT7KzITERjHGm2dl1e76OSWgdKyvn/smv8Y+CzTzQzscvy64nociFD1rnZcPsRJhlnGleHd8YAJt88GoazEpwpptcOrCqIz6FYn/qmIRFbU41HjLGvAoUGGOuBw7VsHwP4KfW2gX+ENYH+M+pCxhjbgE81tqBxpipxpgu1tr1Z7IB4vD5ICsLSkqc+aIiZx4gMzNy64gn2dnw/PMn58vLT85PnFjz83VMQqvkeBnjct7g480N+NV5kxjV5nVnAESef4d0itAOycuGDae8MWz5yfn+tXhjgPMHLC8Lyv0HtqQo8tuhOuJXKPanjknYGGtt9QsYkwxcZq1dbIzpCRRaaw/UuGJjBgFPATdYaw9Weew54G1r7b+NMXcAjay104KtKz093ebn59dic+qvtDTnj3JVqalQWBi5dcSTxEQnbFXl8UBZWc3P1zEJnQMlJxg1PY+lxXt5puOzDGn1/ukLeFPhpsLIFDM70QlbVRkP3FmLNwY4vQclAQ5sJLdDdcSvUOxPHZOzYowpsNamB3qsNleuLwUW+79fVssXNMDtwD7gRIBFGgNb/N/vxekVq7qOLCALICUlpTYvW68VF9etPVzriCeBQld17VXpmITGzkOl3D0lj427jjAx9Wmuaz7/6wuVRHCHBApd1bUHEqzeSG6H6ohfodifOiZhE5YRqdZxH7Ac+EGARQ5zcqxYk0B1WGtzrLXp1tr0tm0DDhOTUwTLpnXJrKFYRzzxBPn8brD2qnRMzt7mfSXc9sJ8iveWMHVkP65rvzXwgt4I7hAT5A0QrD2QYPVGcjtUR/wKxf7UMQmbkAcvY8zPjTF3+2dbAPsDLFaAc2kKgJ5AYajrqG8mTABvlTukeL1OeyTXEU8qx1LVtr0qHZOzs2HnIYY8P5+9R44zc3QGV3ZpAz0ngKfKDvF4nfZIuTDIGyBYeyDRsB2qI36FYn/qmISPtTakX0BL4L/AR8BEoCvwVJVlmgHLcC5RsRpoXt06+/bta6VmubnWpqZaa4wzzc11Zx3xZPx4az0ea8GZjh9ft+frmJyZFZv3295PvGP7Pvlfu2rrgdMf3Jhr7Sup1vqMM93owg5ZON7aWR5rfTjThXV8Y1gbHduhOuJXKPanjskZA/JtkExT4+D6cPF/4vFa4CNrbbW3IdLgepH6Y+HGPYyZkU+zRkn4xmSQ1qax2yWJiNTJWQ2uDxdr7T5gjluvLyLR54M1O7k3t4COLRuROyaD9s2rvWygiEjM0Y3NRCQqvL5sKw+8tJRL2zdj+qh+tG7S0O2SRERCTsFLRFw3a2Exj7y6gn5prZgyIp2myUlulyQiEhYKXiLiqhc+/ILfvLWGqy85h4mZfUhOqsNlGUREYoyCl4i4wlrL7/6zlonzvuD7Pc/jD7f1JEk3uxaROKfgJSIRV1FheexfK8ldUMxdGSk8eWM3PAnG7bJERMJOwUtEIupEeQX/O3cZry3dyr1XXcjPr7sY5y5jIiLxT8FLRCKm9EQ5989azLurd/LgdReTPbiz2yWJiESUgpeIRMSh0hOMmZFPXuFenrqpG8MGpLpdkohIxCl4iUjY7T1ynJHT8li19SDP3t6LG3t1cLskERFXKHiJSFhtP1DK8CkLKd5bwqThffnWpe3cLklExDX67LacxueDtDRISHCmPp/bFUksK9pzhCEvfMa2A6XMuKd//ISuTT54NQ1mJTjTTWfwgxKKdUSLaNkf0bBPo6GGaKpDvkY9XvIVnw+ysqCkxJkvKnLmATIz3atLYtPa7YcYNmUhZeUVzBqbQY+OLdwuKTQ2+SAvC8r9PyglRc48QKda/qCEYh3RIlr2RzTs02ioIZrqkICMtdbtGmqUnp5u8/Pz3S4j7qWlOWGrqtRUz0A+PAAAIABJREFUKCyMdDUSy5YU72PktEUkJyWQOzqDLu2aul1S6Lya5vwhq8qbCjcVRm4d0SJa9kc07NNoqCGa6qjHjDEF1tr0QI+px0u+Ulxct3aRQD7dsJuxL+bTtmlDckdncH4rr9slhVZJkB+IYO3hWke0iJb9EQ37NBpqiKY6JCCN8ZKvpKTUrV2kqnc+386oaYs4v6WXueMGxl/oAvAG+YEI1h6udUSLaNkf0bBPo6GGaKpDAlLwkq9MmADeKn8nvV6nXaQmLy/ezHjfYi47rxkvjRvAOc2S3S4pPHpOAE+VHxSP12mP5DqiRbTsj2jYp9FQQzTVIQEpeMlXMjMhJ8cZ02WMM83J0cB6qdmMzwr56ZxlDLigFb4xGbTw/v/27jw+qvJQ4/jzJoQl7PsmSwBBUQhLmIBXLXq17nXH2rAHo9LW1vbWLtjNK22vt9re1osaCbIkIOBCtXbRtqJWMcMECCAKAoEga9iXISGZvPePCTdKE5LA5Jw5M7/v58Nnct45YZ55c5g8nDlzTlO3IzWelAzJlx0+XkYmfOvLbthBy5H4O6JFtMxHNMxpNGSIphyoEQfXAzhn1lo9/Y/NevKtTfry4K763b3D1Twp0e1YAOAqDq4HEHHWWs1842PN/meR7hjRU0/cOVRNEtmJDgBnQ/EC0GChSqsfvbJOiwM7NPmyvvrJzYOVkGDcjgUAUY/iBaBByipCenjxGv1p3R499O8X6uFrLpQxlC4AqA+KF4B6C56q0AO5q/TuphI9etPFmnZFP7cjAYCnULwA1MuRk+XKnLtSq4oP6Yk7h2rcqF5uRwIAz6F4AajT/uNlmpjj16f7junpr43QjUO6ux0JADyJ4gXgrHYePqkJs/O1+0ipZk8apS8N7Ox2JADwLIoXgFptKTmuCbPzdaysQrnTfBrZp4PbkQDA0yheAGq0fucRTZrjlzHSi1mjdUmPtm5HAgDPo3gB+BeBbQc1Ze5KtW7WRLnT0tWvcyu3IwFATKB4AfiC5Rv36YHcAvVo10K5menq0a6F25EAIGZQvAD8vzfW7ta3F6/WhV1aa36mT51aNXM7EgDEFC6sBkCStHhlsb65aJWG9WqnRVmjKV2NzT9dWtREWmjCt/7pbidyF/NRrShPWtZXWpgQvi3KczvRuYul5xIh7PECoOff3aqZf/pYXxrYWc+OH6kWTRPdjhTb/NOlzc9UL9tQ9bJvljuZ3MR8VCvKk/xZUigYXg5uDy9LUkqGe7nORSw9lwhijxcQx6y1evLNjZr5p49105Duen5iGqXLCVuyGzYe65iPaoUzqovKaaFgeNxrYum5RBB7vIA4VVlp9fPXP9K8Fdv11VG9NPP2IUpM4GLXjrChho3HOuajWrC4YePRLJaeSwSxxwuIQxWhSn13aaHmrdiurCv76Zd3ULocZWrZq1jbeKxjPqol927YeDSLpecSQRQvIM6Ulof0YN4qvbp6p7533SD98IaLZAyly1H9sxo2HuuYj2qpM6XE5C+OJSaHx70mlp5LBPFWIxBHjpdVKGt+QB9sOaD/vPUSTRjT1+1I8en0AeNbssNvp5nEcMmItwPJT2M+qp0+6LxwRvgtueTe4aLixYPRY+m5RJCx1rqdoU5paWk2EAi4HQPwtMPBU5r0wkqt33lEv757qG4ffoHbkQAgJhljCqy1aTXdxx4vIA7sO1qqCTl+FR04oWfHj9S1g7u6HQkA4hLFC4hxOw4GlTE7XweOl2nulFG6rH8ntyMBQNyieAEx7NO9xzQ+J19lFZXKu2+0hvVq53YkAIhrFC8gRhXuOKzJL/iVlJigxVljNKhba7cjAUDco3gBMWjFlgOaNm+lOrRqqrzM0erdMbnubwIANDqKFxBj/rZhr6YvXKU+HZKVOy1dXds0dzsSAKAKxQuIIctW79R3lxbq0h5tNHeKT+1bNnU7EgDgcyheQIxYsGKbfvLaRxqd0lHPT0pTq2b88waAaMMrM+Bx1lrNWr5F//3Xjbrm4q56+mvD1TwpDq9xBwAeQPECPMxaq1/95RM9985W3Tash/777lQlJXIJVgCIVhQvwKNClVaPLluvRf5iTRzTRz+75RIlJHCxawCIZvzXGPCgUxWV+taLq7XIX6xvXDVAP/+KA6WrKE9a1ldamBC+Lcpr3MeLZtEyF/7p0qIm0kITvvVPdydHtMwH4AHs8QI85uSpkB7MK9DyjSX60Y0XKevK/o3/oEV5kj9LCgXDy8Ht4WVJSslo/MePJtEyF/7p0uZnqpdtqHrZN8u5HNEyH4BHsMcL8JCjpeWaNMevdzaV6Jd3DHGmdElS4YzqX6ynhYLh8XgTLXOxJbth440lWuYD8Aj2eAEeceB4mSa94NfGPcf0+3uH6+ahPZx78GBxw8ZjWbTMhQ01bLyxRMt8AB7BHi/AA3YfOalxz63Q5n3HlT0xzdnSJUnJvRs2HsuiZS5MLacMqW28sUTLfAAeQfEColzR/hO665kV2ne0TPOnpuuqQV2cD5E6U0o843qPicnh8XgTLXPRP6th440lWuYD8AiKFxDFNuw6qrufXaGT5SEtyhotX0oHd4KkZEi+bCm5jyQTvvVlx+fB09EyF75Z0oAHq/dwmcTwspMH1kvRMx+ARxhrrdsZ6pSWlmYDgYDbMQBHFWw/qCkvrFTLZk20IDNdA7q0cjsSAKAejDEF1tq0mu7j4HogCr33aYmy5heoW9vmWpDp0wXtk+v+JgBA1KN4AVHmL+t366FFa9S/SyvNn+pT59bN3I4EAIgQihcQRZYGduj7L6/V8N7tNWfyKLVtkeR2JABABFG8gCgx559FeuyPG3TFhZ303ISRSm7KP08AiDW8sgMus9bqt3/7VP/z9091w6Xd9NuvDlOzJg6fiwkA4AiKF+Ciykqrx/64QXM/2Ka7R16gX94xRE0SOcsLAMQqihfgkopQpb7/8jq9vOozZV6eohk3XqyEBON2LABAI6J4AS4oqwjpoUWr9deP9uo71w7UN68eIGMoXQAQ6yhegMNOlFXo/gUF+ufm/frpLYM15d9S3I4EAHAIxQtw0JFguSbP9atwx2E9eXeq7hx5gduRAAAOongBDtl3rFQTc/zaWnJCszJG6vpLu7kdCQDgMIoX4IAdB4OakJOvfcfKNGfyKF1+YSe3IwEAXMDn1oFGtnnfMd397AodPHFKudPSKV3RoChPWtZXWpgQvi3K82aGaHgeABqEPV5AI1r32RFNesGvxASjJQ+M0UXd2rgdCUV5kj9LCgXDy8Ht4WVJSsnwToZoeB4AGow9XkAjyd96QPc+/6FaJCVq6f2UrqhROKO6rJwWCobHvZQhGp4HgAZjjxfQCN7+ZJ8eyC1Qrw7Jys1MV7e2zd2OhNOCxQ0bj9YM0fA8ADQYe7yACHutcJfumx/QwK6tteT+MZSuaJPcu2Hj0ZohGp4HgAajeAERlJe/Xd96cbVG9Gmvhfelq0PLpm5HwplSZ0qJyV8cS0wOj3spQzQ8DwANRvECIuSZ5Vs049X1umpQF82f6lPr5kluR0JNUjIkX7aU3EeSCd/6sp09ID0SGaLheQBoMGOtdTtDndLS0mwgEHA7BlAja62e+OtGPbN8i76S2kNPjktVUiL/pwGAeGWMKbDWptV0HwfXA+ehstLqx39Yr7z8YmWk99Zjt16qxAQudg0AqBnFCzhH5aFK/cfSQv1hzS49OLa/HrlukIyhdAEAakfxAs5BaXlIX89bpb9/sk+PXD9I08cOcDsSAMADKF5AAx0rLde0eQH5tx3U47ddqvGj+7gdCQDgERQvoAEOnjilyS/4tWHXUf32nmG6dVhPtyMBADyE4gXU054jpRqfk68dB4PKnjhSV1/U1e1IAACPoXgB9bBt/wmNz8nX4WC55k31aXS/jm5HAgB4EMULqMMne45qQo5fFaFKLbpvtIZc0NbtSAAAj+Isj8BZrCo+pHue+1CJxmjJ/WMoXQCA88IeL6AW72/er/vmB9S5dTPlZqarV4fkur8JAICzoHgBNfjrR3v0zYWr1a9zS82f6lOXNs3djgQAiAEUL+AMLxd8pkdeXquhF7TVC5NHqV1yU7cjAQBiRMSP8TLGtDXG/NkY86Yx5lVjzL/81jLGNDHGFBtjllf9GRLpHMC5mPt+kb67tFCj+3VQbmZ67JSuojxpWV9pYUL4tijP7UTuOt/5YD5jEz9XOKAx9nhlSHrKWvuWMeYZSddLeu2MdYZKWmSt/X4jPD7QYNZa/f4fm/XUW5v05cFd9bt7h6t5UqLbsSKjKE/yZ0mhYHg5uD28LEkpGe7lcsv5zgfzGZv4ucIhEd/jZa2dZa19q2qxs6R9Naw2WtLNxhi/MSbHGMNbnnCNtVYz3/hYT721SXeM6KlZGSNip3RJUuGM6l8mp4WC4fF4dL7zwXzGJn6ucEijnU7CGDNGUntr7Yc13L1S0jXWWp+kJEk31vD9WcaYgDEmUFJS0lgxEedClVbff3mtZv+zSJMv66tf35WqJokxdpaVYHHDxmPd+c4H8xmb+LnCIY3yG8YY00HS7yVNrWWVtdba3VVfByRdeOYK1tpsa22atTatc+fOjRETca6sIqRvLFylJYHP9K1/v1A/vWWwEhKM27EiL7l3w8Zj3fnOB/MZm/i5wiGNcXB9U0lLJf3QWru9ltUWGGNSjTGJkm6TVBjpHMDZBE9VaNq8gP68fo9+fPNgPXztQBkTg6VLklJnSolnnIMsMTk8Ho/Odz6Yz9jEzxUOaYw9XpmSRkiaUfWJxZ8aYx4/Y53HJC2QtEbSCmvt3xohB1CjIyfLNSHHr/c379cTdw1V5uUpbkdqXCkZki9bSu4jyYRvfdnxe8Dw+c4H8xmb+LnCIcZa63aGOqWlpdlAIOB2DMSAkmNlmjjHr837jul3Xx2uG4Z0dzsSACDGGGMKrLVpNd3HpwkRN3YePqnxs/O150ipciaN0pUDOXYQAOAsihfiwpaS45owO1/HyiqUO82nkX06uB0JABCHKF6Ieet3HtGkOX4ZIy3OGqPBPdq4HQkAEKcoXohpK7cd1NQXVqpNiyQtyPSpX+dWbkcCAMQxihdi1vKN+/RAboF6tGuh3Mx09WjXwu1IAIA4R/FCTPrj2l16ePEaDezaWvOm+tSpVTO3IwEAQPFC7HnRX6wfvrpOaX3aK2fyKLVpnuR2JAAAJFG8EGOy392iX/zpE40d1FnPZIxUi6YxdLFrAIDnUbwQE6y1evLNTXr67c26aWh3/WbcMDVtEmMXuwYAeB7FC55XWWn1s9c/0vwV23Wvr5cev22IEmPxYtcAAM+jeMHTykOVeuSltXp19U7df2U//eCGi2L3YtcAAM/jvRh4Vml5SA/mrtKrq3fqe9cNis7SVZQnLesrLUwI3xbluZ0IkuSfLi1qIi004Vv/dLcTAYgT7PGCJx0vq9B98wJasfWA/vPWSzRhTF+3I/2rojzJnyWFguHl4PbwsiSlZLiXK975p0ubn6letqHqZd8sdzIBiBvs8YLnHDpxShmz8+XfdlC/uSc1OkuXJBXOqC5dp4WC4XG4Z0t2w8YBIILY4wVP2Xu0VBNy8rXtQFDPjh+pawd3dTtS7YLFDRuHM2yoYeMAEEHs8YJnFB8I6u5nV2jnoZOaO2VUdJcuSUru3bBxOMPUcm632sYBIIIoXvCETXuP6a5nP9DR0nLl3Tdal/Xv5HakuqXOlBKTvziWmBweh3v6ZzVsHAAiiOKFqLdmx2GNe26FJGnJ/WM0rFc7lxPVU0qG5MuWkvtIMuFbXzYH1rvNN0sa8GD1Hi6TGF7mwHoADjDWWrcz1CktLc0GAgG3Y8AFH2zZr/vmBdSxVTPlZqard8fkur8JAAAXGWMKrLVpNd3HwfWIWm9t2KuvL1ylvh2TtSAzXV3bNHc7EgAA54Xihaj06urP9B9L1+rSnm01d/IotW/Z1O1IAACcN4oXos6CFdv04z98pDH9Our5SWlq1YzNFAAQG/iNhqhhrdWs5Vv033/dqGsu7qqnvzZczZP4iD8AIHZQvBAVrLX61Z8/0XPvbtXtw3vqibuGKimRD90CAGILxQuuC1VaPbpsnRb5d2jimD762S2XKCEhyi52DQBABFC84KpTFZV6eMkavbF2t75x1QB998sDZQylCwAQmyhecM3JUyE9kFugdzaV6Ec3XqSsK/u7HQkAgEZF8YIrjpaWK3PuSgW2H9Kv7hiir/q4fiEAIPZRvOC4/cfLNGmOX5v2HtPT947QTUO7ux0JAABHULzgqF2HT2p8Tr52HT6p5yemaeygLm5HAgDAMRQvOGZryXFNyPHr6MlyLchM16i+HdyOBACAozhREiIuL0/q21dKSAjf5uVJG3Yd1bjnVqi0PKRFWaMpXQ1RlCct6ystTAjfFuW5ncj7mFPUhO0CDmCPFyIqL0/KypKCwfDy9u3S9J8cVPd7VqpD6yZaMC1d/Tu3cjeklxTlSf4sKVQ1ocHt4WVJSslwL5eXMaeoCdsFHMIeL0TUjBnVpUuSmvctUdtb/So93ExLH7yM0tVQhTOqfxGcFgqGx3FumFPUhO0CDqF4IaKKi6u/Th64W13uWqmKQy312fwx6tmuhXvBvCpY3LBx1I05RU3YLuAQihciqnfV6bhaDtmhTreuUtnudtqzaLQu6NTM3WBelVzL+c1qG0fdmFPUhO0CDqF4IaJmzpQ6XrZVnW5cq9LtnbRviU8tEpM0c6bbyTwqdaaUmPzFscTk8DjODXOKmrBdwCEUL0SMtVZ7u2xSqys+lnZ0U8kraerdo4mys6UMjk09NykZki9bSu4jyYRvfdkc7Hs+mFPUhO0CDjHWWrcz1CktLc0GAgG3Y+AsKiutHvvjBs39YJvGpV2gX9w+RE0S6fUAgPhjjCmw1qbVdB+nk8B5qwhV6pGX1+qVVTuVeXmKHr3pYhlj3I4FAEDUoXjhvJSWh/TQotV6c8Nefefagfrm1QMoXQAA1ILihXN2oqxCWQsCen/zAf3slsGa/G8pbkcCACCqUbxwTg4HT2nK3JVa+9kRPXl3qu4ceYHbkQAAiHoULzTYvmOlmpjj19aSE5qVMULXXdLN7UgAAHgCxQsNsuNgUONz8lVyrEwvTBmlfxvQye1IAAB4BsUL9fbp3mMan5Ov0vJK5U5L14je7d2OBACAp1C8UC9rPzusSXP8apKYoMX3j9ZF3dq4HQkAAM+heKFOH249oGnzAmqXnKTczHT17dTS7UgAAHgSxQtn9Y9P9urB3FXq1SFZuZnp6ta2uduRAADwLIoXavWHNTv13SWFurh7G82b6lOHlk3djgQAgKdRvFCj3A+368d/WC9f3w6aPSlNrZsnuR0JAADP4yrG+Bezlm/Wo8vW66pBXTRvqo/SBeDsivKkZX2lhQnh26K8+M4BnAV7vPD/rLX6r79s1LPvbNGtw3ro13enKimRbg7gLIryJH+WFAqGl4Pbw8uSlJIRfzmAOvBbFZKkUKXVo8vW69l3tigjvbd+M24YpQtA3QpnVJed00LB8Hg85gDqwB4vqDxUqe8sKdTrhbs0fWx/fe+6QTLGuB0LgBcEixs2Hus5gDqwSyPOlZaHdP+CAr1euEvfv/4iPXL9RZQuAPWX3Lth47GeA6gDxSuOHSst18Q5fr29cZ9m3n6pHhzb3+1IALwmdaaUmPzFscTk8Hg85gDqQPGKUwdPnNLXns/Xqu2H9D9fHa6M9D5uRwLgRSkZki9bSu4jyYRvfdnOH9AeLTmAOhhrrdsZ6pSWlmYDgYDbMWLG7iMnNSHHrx0Hg3pm/AhdfVFXtyMBABAzjDEF1tq0mu7j4Po4s23/CWXMzteRk+WaP9Wn9H4d3Y4EAEDcoHjFkY93H9WEHL9ClZVadN9oDbmgrduRAACIKxSvOLGq+JAmz/EruWkTvZg1RgO6tHY7EgAAcYfiFQf++el+ZS0IqHPrZsrNTFevDsl1fxMAAIg4ileM+8v6PXpo0Wr169xS8zN96tK6uduRAACIWxSvGPZSwWd65KVCpfZqp7mTfWqbzMWuAQBwE8UrRr3wfpF+/voGXT6gk56bMFItm/GjBgDAbfw2jjHWWv3u75v1m79t0nWXdNXv7h2uZk0S3Y4FAABE8YoplZVWj7/xsea8X6Q7R1yg/7pziJokcnECAACiBcUrRlSEKvXDV9ZpacFnmnxZX/3k5sFKSOBi1wAARBOKVwwoqwjpW4vW6C8f7dG3/v1CffuaC2UMpQsAgGhD8fK44KkK3b+gQO99ul8/vnmwMi9PcTsSAACoBcXLw44EyzV13kqtLj6kJ+4aqnFpvdyOBAAAzoLi5VElx8o0ISdfW0qOa1bGCF1/aXe3IwEAgDpQvDzos0NBTcjxa8+RUuVMGqUrB3Z2OxIAAKgHipfHbN53XBNy8nWirEK503wa2aeD25EAAEA9Ubw8ZP3OI5o4x68EI72YNUaDe7RxOxIAAGgAipdH+IsOKnPuSrVpkaTcaelK6dTS7UgAAKCBKF4e8PbGfXpgQYF6tm+h3Mx09WjXwu1IAADgHFC8otzrhbv08OI1uqh7a82b4lPHVs3cjgQAAM4RxSuKLfIX60evrtOoPh00e3Ka2jRPcjsSAAA4DxSvKPXcO1v0yz9/orGDOuuZjJFq0TTR7UgAAOA8UbyijLVWv35zo/737S26eWh3PTVumJo2SXA7FgAAiACKVxSprLT66WsfacGH23Wvr5cev22IEhO42DUAALGC4hUlykOV+t7SQi1bs0v3X9lPP7jhIhlD6QIAIJZQvKJAaXlI31i4Sn/7eJ++d90gTR/bn9IFAEAMoni57HhZhabNW6n8ooP6z9su1YTRfdyOBAAAGgnFy0WHTpzS5Bf8Wr/rqH4zbphuG97T7UgAAKARUbxcsudIqSbk5Gv7waCeGz9S1wzu6nYkAADQyCheLig+EFRGzoc6ePyU5k3xaUz/jm5HAgAADqB4OWzjnmOakJOvU6FKLbxvtFJ7tXM7EgAAcEjEz8xpjGlrjPmzMeZNY8yrxpimtayXY4xZYYx5NNIZotWaHYc17rkVkqQl94+hdKF+ivKkZX2lhQnh26I8txMBAM5RY5wSPUPSU9baL0vaI+n6M1cwxtwhKdFaO0ZSP2PMhY2QI6p8sHm/Mp7/UG1bJOmlBy7TwK6t3Y4ELyjKk/xZUnC7JBu+9WdRvgDAoyJevKy1s6y1b1Utdpa0r4bVxkpaUvX1m5Iuj3SOaPLmR3s0ee5K9WzfQi89MEa9Oya7HQleUThDCgW/OBYKhscBAJ7TaBcBNMaMkdTeWvthDXe3lLSz6uuDkv7lI33GmCxjTMAYEygpKWmsmI3u1dWf6cG8Vbq4exstzhqjLm2aux0JXhIsbtg4ACCqNUrxMsZ0kPR7SVNrWeW4pBZVX7eqKYe1Nttam2atTevcuXNjxGx08z7YpocXFyo9pYPypqWrfcsaD3cDapfcu2HjAICo1hgH1zeVtFTSD62122tZrUDVby+mStoW6Rxustbq6X98qp++9pGuHdxVcyaPUqtmfIAU5yB1ppR4xlvTicnhcQCA5zRGG8iUNELSDGPMDElvS0qy1n7+04vLJL1njOkh6QZJoxshhyustfrFnz7W8+8V6fbhPfXEXUOVlNho7+gi1qVkhG8LZ4TfXkzuHS5dp8cBAJ5irLXuPLAx7SVdK+lda+2es62blpZmA4GAM8HOQ6jS6kevrNPiwA5NHNNHP7vlEiUkcLFrAADiiTGmwFqbVtN9rr3/Za09pOpPNnreqYpKPbx4jd5Yt1vfvHqAvnPtQBlD6QIAANU48CgCTp4K6YHcAr2zqUQzbrxY913Zz+1IAAAgClG8ztORk+XKnLtSq4oP6b/uHKJ7RvFpMwAAUDOK13nYf7xME3P8+nTfMf3+3hG6aWh3tyMBAIAoRvE6RzsPn9SE2fnadeSknp+YprGDurgdCQAARDmK1znYWnJc42fn61hphRZkpmtU3w5uRwIAAB5A8Wqgj3Yd0aQ5flkrLcoarUt7tnU7EgAA8AiKVwMEth3UlLkr1bpZEy2Ylq7+nVu5HQkAAHgIxaue3tlUovsXBNSjbQstmJaunu1a1P1NAAAAn0Pxqoc/rdutb724WgO6tNb8qT51bt3M7UgAAMCDKF51WLJyh37wylqN6N1eOZNHqW2LJLcjAQAAj6J4ncXs97bq8Tc+1pUDO+vZ8SOU3JTpAgAA544mUQNrrX7z1ib97h+bdeOQbvrtPcPVtEmC27EAAIDHUbzOUFlp9dgfN2juB9t0T1ov/eKOIUpM4GLXAADg/FG8PqciVKlHXlqrV1bv1LTLUzTjpotlDKULAABEBsWrSml5SA8tWq03N+zVd68dqG9cPYDSBQAAIoriJel4WYWy5gf0wZYD+vlXLtGky/q6HQkAAMQgipek4KkK7TlSqifvTtWdIy9wOw4AAIhRFC9JXVo311++fSWfXAQAAI2KplGF0gUAABobbQMAAMAhFC8AAACHULwAAAAcQvECAABwCMULAADAIRQvAAAAh1C8AAAAHELxAgAAcAjFCwAAwCEULwAAAIdQvAAAABxC8QIAAHAIxQsAAMAhFC8AAACHULwAAAAcQvECAABwCMULAADAIRQvAAAAh1C8AAAAHELxAgAAcAjFCwAAwCEULwAAAIcYa63bGepkjCmRtN2Bh+okab8DjxMvmM/IYj4jjzmNLOYzspjPyHJyPvtYazvXdIcnipdTjDEBa22a2zliBfMZWcxn5DGnkcV8RhbzGVnRMp+81QgAAOAQihcAAIBDKF5flO12gBjDfEYW8xl5zGlkMZ+RxXxGVlTMJ8d4AQAAOIQ9XgAAAA6heCEijDFdjTGra7mviTGm2BizvOrPEKfzIT7Vd9szxqz53DrXOp0TMMbMMsbcUst9vIbGkLgsXmcrCVX35xhjVhhjHnUyl8f9WlJ2CqPhAAAFiUlEQVSLWu4bKmmRtXZs1Z91DubylAYUhZ8bY1YaY/7X6YweU+e2Z4zpKOmTz63zlvMxvedsRaHqfl5H68kYc4Wkbtba12tZhdfQejLGPPi51881xpjnalnPte0zLouXzlISjDF3SEq01o6R1M8Yc6GjyTzIGHO1pBOS9tSyymhJNxtj/FUbexPn0nlOfYrCSEmXS/JJ2meMucbpkB5Sn20vXZLPGPOBMWaZMaa1wxk9p66iwOto/RljkiQ9L2mbMebWWlbjNbSerLXPnH79lPSewnP7BW5vn3FXvOpREsZKWlL19ZsK/4JDLYwxTSX9WNIPzrLaSknXWGt9kpIk3ehENo+qzwvslyS9bMOfjPmrpCscTegt9dn2tkq6zlp7maS1kqY4mM9z6lkUxorX0fqaKGmDpCcU/g/AN2tYh9fQBjLG9JTU1VobqOHusXJx+4yr4lXPktBS0s6qrw9K6trYuTzuB5JmWWsPn2Wdtdba3VVfByTxv9/a1ecFlm20/uqz7W2VtLmOdVCtPkWBbbT+hkvKttbukZQr6aoa1uE1tOG+LumZWu5zdfuMq+Kl+pWE46p+G7KV4m+OGuoaSV83xiyXNMwYM7uGdRYYY1KNMYmSbpNU6GRAj6nPCyzbaP3VZ9ubKen0sUp31bIOqtWnKLCN1t9mSf2qvk5Tzdcl5jW0AYwxCQpvl8trWcXV7TPe/jHUpyQUqHq3Y6qkbc5E8yZr7ZWfez99jaSnjDGPn7HaY5IWVN2/wlr7N4djekl9XmDZRuvvC9uepFU1/Lt/StIMY8x6SWWS5jkb0XPqUxTYRusvR9JVxph3JU2X9BKvoeftCkn5tvYTlbq6fcbtCVSrytd0SV+z1j76ufE2Ch+Q93dJN0gaba094kpIxB1jzKWSFkoykl6T9KSkJ6y10z63ToLC22hA0vWSrrfWFrkQF3Go6sMHcxR+eyZJ0n9IuoHXUUQLY8wvJAWsta8YYwYryn7Px23xOhtjTHtJ10p6t2p3OhBVjDEtJN0kaZW1dqvbeYAz8TqKaObm9knxAgAAcEi8HeMFAADgGooXAACAQyheAGJW1YdoIrZePf+uvsaYsZ9bnmyMmRypvx+At1G8ACCy+ip8ZmwA+Bdc7wmA66o+pblUUhtJByTdLamppPmSukhaZ639ujHmZwpfWzFZUomkr0qyCp/jqI+k/ZLustaWn0cWIylb0sCqx7hH0gSFz/eTKqmbpHGSPlL4BKL9FT4L9vaqP1Mktava63V31V+baoz5x+nvtdauP9d8ALyNPV4AosFgSZXW2islvaDw2aSzJK2vGutujBlate571tovSdor6VZJHSW9ofA1LI9KGnGeWW6VlFT1GMUKn7ZDkkZJuk7SryR9RVJ7SV2staMlpVhrv2Ot/R9J35Y0t+rEwiW1fC+AOEXxAhANVklab4x5U+GCEpQ0SNLtVcdf9ZPUs2rdgqrbtQq/rVcu6WaF95j1U/WlQM7VIEljqh73SlVfx21R1Z60YoX3xgUlNTPG5EvKq+PvPPN7AcQpiheAaJAq6X1r7ZcV3pN0haSNkn5bdTmqRxUuLZLkq7odrvDla+6QtL7qdqfO30ZJL1Y97rcVviC0JJ04Yz2fpFettenW2ic/N35S4bdCT79tWdP3AohTFC8A0WCbpIeMMR8ofBxUQNLzkm6ouobdA5J2VK07qmpvVDtJf5T0vsLHYf1TUgdV7xk7V69J6mGMeUfS46r5WoSS9Imk7xhj3jbGvGyMuaJqfLWkQcaY96pyAcD/48z1ADyj6uD65dba5S5HkTHmJkmPSDql8F6uhdbaF91NBSDaUbwAAAAcwluNAAAADqF4AQAAOITiBQAA4BCKFwAAgEMoXgAAAA6heAEAADjk/wDUHmK+zOsfCQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "clf = Perceptron(fit_intercept=True, \n",
    "                 max_iter=1000,\n",
    "                 tol=None,\n",
    "                 shuffle=True)\n",
    "clf.fit(X, y)\n",
    "\n",
    "# 画布大小\n",
    "plt.figure(figsize=(10,10))\n",
    "\n",
    "# 中文标题\n",
    "plt.rcParams['font.sans-serif']=['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "plt.title('鸢尾花线性数据示例')\n",
    "\n",
    "plt.scatter(data[:50, 0], data[:50, 1], c='b', label='Iris-setosa',)\n",
    "plt.scatter(data[50:100, 0], data[50:100, 1], c='orange', label='Iris-versicolor')\n",
    "\n",
    "# 画感知机的线\n",
    "x_ponits = np.arange(4, 8)\n",
    "y_ = -(clf.coef_[0][0]*x_ponits + clf.intercept_)/clf.coef_[0][1]\n",
    "plt.plot(x_ponits, y_)\n",
    "\n",
    "# 其他部分\n",
    "plt.legend()  # 显示图例\n",
    "plt.grid(False)  # 不显示网格\n",
    "plt.xlabel('sepal length')\n",
    "plt.ylabel('sepal width')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在可以看到，所有的两种鸢尾花都被正确分类了。\n",
    "\n",
    "----"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 第2章感知机-习题\n",
    "\n",
    "### 习题2.1\n",
    "&emsp;&emsp;Minsky 与 Papert 指出：感知机因为是线性模型，所以不能表示复杂的函数，如异或 (XOR)。验证感知机为什么不能表示异或。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**解答：**  \n",
    "\n",
    "对于异或函数XOR，全部的输入与对应的输出如下：  \n",
    "\n",
    "|<div style=\"width:20px\">$x^{(1)}$</div>|<div style=\"width:20px\">$x^{(2)}$</div>|$y$|\n",
    "|:-: | :-: | :-: |  \n",
    "| &nbsp;1 |  &nbsp;1 |-1 | \n",
    "| &nbsp;1 | -1 | &nbsp;1 | \n",
    "|-1 |  &nbsp;1 | &nbsp;1 | \n",
    "|-1 | -1 |-1 | "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "参考代码：https://github.com/wzyonggege/statistical-learning-method\n",
    "\n",
    "本文代码更新地址：https://github.com/fengdu78/lihang-code\n",
    "\n",
    "习题解答：https://github.com/datawhalechina/statistical-learning-method-solutions-manual\n",
    "\n",
    "中文注释制作：机器学习初学者公众号：ID:ai-start-com\n",
    "\n",
    "配置环境：python 3.5+\n",
    "\n",
    "代码全部测试通过。\n",
    "![gongzhong](../gongzhong.jpg)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
